Spring BeanDefinitionBuilder tutorial

Spring BeanDefinitionBuilder tutorial shows how to programatically create new Spring beans using BeanDefinitionBuilder.

Spring BeanDefinitionBuilder tutorial

Spring BeanDefinitionBuilder tutorial

last modified October 18, 2023

Spring BeanDefinitionBuilder tutorial shows how to programatically create new Spring beans using BeanDefinitionBuilder.

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

BeanDefinitionBuilder

BeanDefinitionBuilder is used to create new Spring beans programatically. It utilizes the builder pattern.

Spring BeanDefinitionBuilder example

The application creates create a simple string bean.

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>

&lt;groupId&gt;com.zetcode&lt;/groupId&gt;
&lt;artifactId&gt;beanbuilderex&lt;/artifactId&gt;
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;

&lt;properties&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
    &lt;maven.compiler.source&gt;17&lt;/maven.compiler.source&gt;
    &lt;maven.compiler.target&gt;17&lt;/maven.compiler.target&gt;
    &lt;spring-version&gt;5.3.23&lt;/spring-version&gt;

&lt;/properties&gt;

&lt;dependencies&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
        &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
        &lt;version&gt;1.4.0&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-context&lt;/artifactId&gt;
        &lt;version&gt;${spring-version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-core&lt;/artifactId&gt;
        &lt;version&gt;${spring-version}&lt;/version&gt;
    &lt;/dependency&gt;
    
&lt;/dependencies&gt;

&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
            &lt;artifactId&gt;exec-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;3.1.0&lt;/version&gt;
            &lt;configuration&gt;
                &lt;mainClass&gt;com.zetcode.Application&lt;/mainClass&gt;
            &lt;/configuration&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

</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.

src/main/resources/logback.xml

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

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

&lt;root&gt;
    &lt;level value="INFO" /&gt;
    &lt;appender-ref ref="consoleAppender" /&gt;
&lt;/root&gt;

</configuration>

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

src/main/java/com/zetcode/Application.java

package com.zetcode;

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan;

@ComponentScan(basePackages = “com.zetcode”) public class Application {

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

public static void main(String[] args) {

    var ctx = new AnnotationConfigApplicationContext(Application.class);

    var beanFactory = (BeanDefinitionRegistry) ctx.getBeanFactory();

    beanFactory.registerBeanDefinition("myBean",
            BeanDefinitionBuilder.genericBeanDefinition(String.class)
                    .addConstructorArgValue("This is my bean")
                    .setScope("prototype")
                    .getBeanDefinition()
    );

    logger.info("{}", ctx.getBean("myBean"));

    ctx.close();
}

}

The example creates a simple bean of type String using BeanDefinitionBuilder.

var beanFactory = (BeanDefinitionRegistry) ctx.getBeanFactory();

A bean factory is retrieved from the application context with getBeanFactory.

beanFactory.registerBeanDefinition(“myBean”, BeanDefinitionBuilder.genericBeanDefinition(String.class) .addConstructorArgValue(“This is my bean”) .setScope(“prototype”) .getBeanDefinition() );

We register a new bean with registerBeanDefinition.

logger.info(”{}”, ctx.getBean(“myBean”));

We get the bean from the application context with getBean
and log it.

$ mvn -q exec:java 20:51:05.970 [com.zetcode.Application.main()] INFO com.zetcode.Application - This is my bean

We run the application.

In this article we have used the BeanDefinitionBuilder to register a new Spring bean programatically.

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all Spring tutorials.

ad ad