ZetCode

Spring bean reference tutorial

last modified October 18, 2023

Spring bean reference tutorial shows how to refer to beans in a XML configuration file in a Spring application.

Spring is a popular Java application framework for creating enterprise applications.

Spring ref attribute

The ref attribute is a shortcut to the <ref> tag, used to refer to other beans for injection.

Spring bean reference example

The application contains two beans: infoMessage and mesageRenderer. The mesageRenderer refers to the infoMessage via the ref attribute.

src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           ├───bean
│   │           │       IMessage.java
│   │           │       InfoMessage.java
│   │           └───service
│   │                   MessageRenderer.java
│   └───resources
│           logback.xml
│           my-beans.xml
└───test
    └───java

This is the project structure.

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
            http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zetcode</groupId>
    <artifactId>beanreference</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <spring-version>5.3.23</spring-version>

    </properties>

    <dependencies>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
        </dependency>
        
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <mainClass>com.zetcode.Application</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

In the pom.xml file, we have basic Spring dependencies spring-core and spring-context and logging logback-classic dependency.

The exec-maven-plugin is used for executing Spring application from the Maven on the command line.

resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <logger name="org.springframework" level="ERROR"/>
    <logger name="com.zetcode" level="INFO"/>

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %blue(%-5level) %magenta(%logger{36}) - %msg %n
            </Pattern>
        </encoder>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="consoleAppender" />
    </root>
</configuration>

The logback.xml is a configuration file for the Logback logging library.

resources/my-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="infoMessage" class="com.zetcode.bean.InfoMessage"/>

    <bean name="messageRenderer" class="com.zetcode.service.MessageRenderer">
            <constructor-arg name="message" ref="infoMessage"/>
    </bean>

</beans>

The my-beans.xml file declares two beans: info and messageRenderer. The infoMessage refers to the infoMessage via the ref attribute. Spring injects the infoMessage bean into the message attribute via constructor injection.

com/zetcode/bean/IMessage.java
package com.zetcode.bean;

public interface IMessage {

    String getMessage();
}

The IMessage interface has one method declaration.

com/zetcode/bean/InfoMessage.java
package com.zetcode.bean;

public class InfoMessage implements IMessage {

    public String getMessage() {

        return "This is information message";
    }
}

The InfoMessage bean returns an information message.

com/zetcode/service/MessageRenderer.java
package com.zetcode.service;

import com.zetcode.Application;
import com.zetcode.bean.IMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MessageRenderer {

    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    private IMessage message;

    public MessageRenderer(IMessage message) {
        this.message = message;
    }
    
    public void renderMessage() {

        logger.info("{}", message.getMessage());
    }
}

The MessageRenderer renders a message. It expects one bean to be injected. Spring injects the infoMessage bean into the MessageRenderer via constructor injection.

com/zetcode/Application.java
package com.zetcode;

import com.zetcode.service.MessageRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.GenericXmlApplicationContext;

public class Application {

    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {

        var ctx = new GenericXmlApplicationContext("my-beans.xml");
        var renderer =  (MessageRenderer) ctx.getBean("messageRenderer");

        renderer.renderMessage();

        ctx.close();
    }
}

This is the main application class. It retrieves the MessageRenderer bean and call its renderMessage method.

$ mvn -q exec:java
12:05:23.567 [com.zetcode.Application.main()] INFO  com.zetcode.Application - This is information message

We run the application.

In this article we have shown how to refer to other beans with Spring's XML ref attribute.

Author

My name is Jan Bodnar and I am a passionate programmer with many years of programming experience. I have been writing programming articles since 2007. So far, I have written over 1400 articles and 8 e-books. I have over eight years of experience in teaching programming.

List all Spring tutorials.