🚀 Master Java & Spring with Ram N Java!
Subscribe to Ram N Java for in-depth tutorials, practical code walkthroughs, and essential software engineering concepts.
🔔 Subscribe on YouTubeWhat Is a BeanPostProcessor in Spring?
The BeanPostProcessor is a powerful interface provided by the Spring Framework that allows developers to customize and modify bean instances during their initialization phase.
Unlike standard bean configuration, a BeanPostProcessor operates on newly created bean instances globally across your Spring container, giving you complete hooks before and after initialization callbacks execute.
Core Methods of BeanPostProcessor
Implementing the BeanPostProcessor interface gives you access to two fundamental lifecycle callback methods:
- postProcessBeforeInitialization(Object bean, String beanName): Executes before any custom bean initialization logic (like
@PostConstructor custominit-method). This is ideal for validating properties or wrapping beans. - postProcessAfterInitialization(Object bean, String beanName): Executes after initialization callbacks have finished. This is commonly used for creating AOP proxies, applying security checks, or decorating bean instances.
Why Use BeanPostProcessor in Your Applications?
- Cross-Cutting Customization: Apply common setup, logging, or verification logic to multiple beans automatically without duplicating code.
- Custom Annotation Processing: Scan for custom annotations and configure beans dynamically at startup.
- Proxy Creation: Wrap target objects inside dynamic proxies to inject behaviors like transaction management and profiling.
📺 Recommended Spring Tutorials from Ram N Java
Click here to watch on Youtube:
https://www.youtube.com/watch?v=D_NLOtD5xi4&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| Spring Bean Life Cycle - BeanPostProcessor | Spring Tutorial |
| Spring Bean Life Cycle - BeanPostProcessor | Spring Tutorial |
| Spring Bean Life Cycle - BeanPostProcessor | Spring Tutorial |
| Spring Bean Life Cycle - BeanPostProcessor | Spring Tutorial |
| Spring Bean Life Cycle - BeanPostProcessor | Spring Tutorial |
<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%20http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ram.core</groupId>
<artifactId>SpringDemo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringDemo</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring 5 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</project>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0%20http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ram.core</groupId>
<artifactId>SpringDemo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringDemo</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring 5 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</project>
Employee.java
package com.ram.model;
/**
* Spring bean
*/
public class Employee
{
private String name;
public void setName(String name)
{
this.name = name;
}
@Override
public String toString()
{
return "Employee [name=" + name + "]";
}
}
/**
* Spring bean
*/
public class Employee
{
private String name;
public void setName(String name)
{
this.name = name;
}
@Override
public String toString()
{
return "Employee [name=" + name + "]";
}
}
Fruit.java
package com.ram.model;
/**
* Spring bean
*/
public class Fruit
{
private String name;
public void setName(String name)
{
this.name = name;
}
@Override
public String toString()
{
return "Fruit [name=" + name + "]";
}
}
/**
* Spring bean
*/
public class Fruit
{
private String name;
public void setName(String name)
{
this.name = name;
}
@Override
public String toString()
{
return "Fruit [name=" + name + "]";
}
}
MyBeanPostProcessor.java
package com.ram.postprocessor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor
{
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException
{
System.out.println("Post Process Before Initialization for the bean = "
+ beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException
{
System.out.println(
"Post Process After Initialization for the bean = " + beanName);
return bean;
}
}
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor
{
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException
{
System.out.println("Post Process Before Initialization for the bean = "
+ beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException
{
System.out.println(
"Post Process After Initialization for the bean = " + beanName);
return bean;
}
}
applicationContext.xml
<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-4.3.xsd">
<bean id="employee" class="com.ram.model.Employee">
<property name="name" value="Peter" />
</bean>
<bean id="fruit" class="com.ram.model.Fruit">
<property name="name" value="Apple" />
</bean>
<!-- This post processor methods are called for every bean -->
<bean class="com.ram.postprocessor.MyBeanPostProcessor" />
</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-4.3.xsd">
<bean id="employee" class="com.ram.model.Employee">
<property name="name" value="Peter" />
</bean>
<bean id="fruit" class="com.ram.model.Fruit">
<property name="name" value="Apple" />
</bean>
<!-- This post processor methods are called for every bean -->
<bean class="com.ram.postprocessor.MyBeanPostProcessor" />
</beans>
App.java
package com.ram.core;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ram.model.Employee;
import com.ram.model.Fruit;
public class App
{
public static void main(String[] args)
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
System.out.println("---------------------------------------");
Employee employee = context.getBean("employee", Employee.class);
System.out.println(
"Got employee object from the ApplicationContext(Spring Container) = "
+ employee);
Fruit fruit = context.getBean("fruit", Fruit.class);
System.out.println(
"Got fruit object from the ApplicationContext(Spring Container) = "
+ fruit);
context.registerShutdownHook();
}
}
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ram.model.Employee;
import com.ram.model.Fruit;
public class App
{
public static void main(String[] args)
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
System.out.println("---------------------------------------");
Employee employee = context.getBean("employee", Employee.class);
System.out.println(
"Got employee object from the ApplicationContext(Spring Container) = "
+ employee);
Fruit fruit = context.getBean("fruit", Fruit.class);
System.out.println(
"Got fruit object from the ApplicationContext(Spring Container) = "
+ fruit);
context.registerShutdownHook();
}
}
Output
Aug 08, 2018 10:06:50 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Wed Aug 08 10:06:50 IST 2018]; root of context hierarchy
Aug 08, 2018 10:06:50 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
Post Process Before Initialization for the bean = employee
Post Process After Initialization for the bean = employee
Post Process Before Initialization for the bean = fruit
Post Process After Initialization for the bean = fruit
---------------------------------------
Got employee object from the ApplicationContext(Spring Container) = Employee [name=Peter]
Got fruit object from the ApplicationContext(Spring Container) = Fruit [name=Apple]
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Wed Aug 08 10:06:50 IST 2018]; root of context hierarchy
Aug 08, 2018 10:06:50 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
Post Process Before Initialization for the bean = employee
Post Process After Initialization for the bean = employee
Post Process Before Initialization for the bean = fruit
Post Process After Initialization for the bean = fruit
---------------------------------------
Got employee object from the ApplicationContext(Spring Container) = Employee [name=Peter]
Got fruit object from the ApplicationContext(Spring Container) = Fruit [name=Apple]
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_BeanPostProcessor.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_BeanPostProcessor
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/924507f5515578f632825f98c99b1cb6c7d7a7be/Spring_2018/SpringDemo_BeanPostProcessor/?at=master
See also:
No comments:
Post a Comment