BeanFactoryPostProcessor
is used for custom modification of an application context's bean definitions.
Any class that implements BeanFactoryPostProcessor is executed before bean
factory is being initialized.
It is a 2
step process.
Step 1:
Implement BeanFactoryPostProcessor interface
Step 2:
Register this bean with spring, by defining in spring.xml
Step 1
: Create new
maven project “spring_tuorial”. Project structure looks like below.
Step 2
: Update
“pom.xml” file for maven dependencies.
pom.xml
<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>spring_tutorial</groupId> <artifactId>spring_tutorial</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>spring_tutorial</name> <description>spring_tutorial</description> <properties> <org.springframework-version>4.1.5.RELEASE</org.springframework-version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> </dependency> </dependencies> </project>
Step
3: Create new
package “com.springtutorial.model” under “src/main/java”.
Step
4: Create “Address”
class under the package “com.springtutorial.model”.
package com.springtutorial.model; public class Address{ private String street; private String city; private String state; private String country; private String pin; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getPin() { return pin; } public void setPin(String pin) { this.pin = pin; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Address [street=").append(street).append(", city=").append(city) .append(", state=").append(state).append(", country=").append(country).append(", pin=") .append(pin).append("]"); return builder.toString(); } }
Step
5: Create
“Employee” class under the package “com.springtutorial.model”.
package com.springtutorial.model; public class Employee { private String firstName; private String lastName; private int id; private Address address; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Employee [firstName=").append(firstName).append(", lastName=").append(lastName) .append(", id=").append(id).append(", address=").append(address).append("]"); return builder.toString(); } }
Step
6: Create NameBeanPostProcessor class in
“com.springtutorial.main” package.
package com.springtutorial.main; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class NameBeanPostProcessor implements BeanPostProcessor{ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Before initializing bean " + beanName); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("After initializing bean " + beanName); return bean; } }
Bean post
processor is created by implementing “BeanPostProcessor” interface.
postProcessAfterInitialization(Object
bean, String beanName)
Method
called after initialization of bean.
postProcessBeforeInitialization(Object
bean, String beanName)
Method
called before initialization of bean.
Step 7
: Create
MyBeanFactoryPostProcessor class in
“com.springtutorial.main” package by implementing BeanFactoryPostProcessor
interface.
package com.springtutorial.main; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { String[] names = beanFactory.getBeanDefinitionNames(); for(String name : names){ System.out.println(name); } } }
Step
8: Create
“spring.xml” file in “src/main/resources”.
spring.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-3.0.xsd"> <bean id="employee1" class="com.springtutorial.model.Employee"> <property name="firstName" value="Hari Krishna" /> <property name="lastName" value="Gurram" /> <property name="id" value="553" /> <property name="address" ref="address"/> </bean> <bean id="address" class="com.springtutorial.model.Address"> <property name="street" value="Chowdeswari temple" /> <property name="city" value="Bangalore" /> <property name="state" value="Karnataka" /> <property name="country" value="India" /> <property name="pin" value="560037" /> </bean> <bean class="com.springtutorial.main.NameBeanPostProcessor" /> <bean class="com.springtutorial.main.MyBeanFactoryPostProcessor" /> </beans>
"spring.xml"
is used to assign unique IDs to different beans, to control the creation of
objects with different values. You have to make sure that “spring.xml” file is
available in CLASSPATH and use the same name in main application while creating
application context as shown in Main.java file.
Step 9
: Create package
“com.springtutorial.main” under “src/main/java”.
Step
10 : Create Main
class under package “com.springtutorial.main”.
package com.springtutorial.main; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.springtutorial.model.Employee; public class Main { public static void main(String args[]) { ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); Employee emp1 = (Employee) context.getBean("employee1"); System.out.println(emp1); ((ClassPathXmlApplicationContext) context).close(); } }
Step
11: Run
Main.java,you will get output like below.
Mar 28, 2015 12:31:08 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1b7682d: startup date [Sat Mar 28 12:31:08 IST 2015]; root of context hierarchy Mar 28, 2015 12:31:08 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [spring.xml] employee1 address com.springtutorial.main.NameBeanPostProcessor#0 com.springtutorial.main.MyBeanFactoryPostProcessor#0 Before initializing bean address After initializing bean address Before initializing bean employee1 After initializing bean employee1 Employee [firstName=Hari Krishna, lastName=Gurram, id=553, address=Address [street=Chowdeswari temple, city=Bangalore, state=Karnataka, country=India, pin=560037]] Mar 28, 2015 12:31:08 PM org.springframework.context.support.ClassPathXmlApplicationContext doClose INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1b7682d: startup date [Sat Mar 28 12:31:08 IST 2015]; root of context hierarchy
No comments:
Post a Comment