Spring BeanFactoryPostProcessor tutorial
last modified October 18, 2023
Spring BeanFactoryPostProcessor tutorial shows how to use BeanFactoryPostProcessor to modify application context's bean definitions.
Spring is a popular Java application framework for creating enterprise applications.
Spring BeanFactoryPostProcessor
Spring BeanFactoryPostProcessor works on the bean definitions or configuration meta data of the
bean before beans are actually created. With BeanFactoryPostProcessor we can
modify exiting bean definitions or create our new bean definitions.
Spring provides some built-in implementations of BeanFactoryPostProcessor.
For instance, the PropertyPlaceholderConfigurer is a post processor that
allows to read properties from external files.
Spring BeanFactoryPostProcessor example
The following application uses BeanFactoryPostProcessor to add a new bean
definition.
pom.xml
src
├───main
│ ├───java
│ │ └───com
│ │ └───zetcode
│ │ │ Application.java
│ │ │
│ │ └───config
│ │ AppConfig.java
│ └───resources
│ logback.xml
└───test
└───java
This is the project structure.
<?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>beanfactorypostprocessorex</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,
spring-context, and logging logback-classic dependency.
The exec-maven-plugin is used for executing Spring application from the
Maven on the command line.
<?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} %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.
package com.zetcode.config;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
return factory -> {
var registry = (BeanDefinitionRegistry) factory;
registry.registerBeanDefinition("myBean",
BeanDefinitionBuilder.genericBeanDefinition(String.class)
.addConstructorArgValue("This is myBean")
.getBeanDefinition()
);
};
}
}
AppConfig is the application configuration class. With @Bean
we create a BeanFactoryPostProcessor which registers a new simple bean
of built-in java.lang.String type. The new bean is registered with
registerBeanDefinition.
package com.zetcode;
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");
logger.info("{}", ctx.getBean("myBean"));
ctx.close();
}
}
In the Application, we get retrieve the registered bean and print it.
$ mvn -q exec:java 18:53:19.233 INFO com.zetcode.Application - This is myBean
We run the application.
In this article we have shown how to use BeanFactoryPostProcessor to
register a new bean.
Author
List all Spring tutorials.