Spring 后置处理器
一、后置处理器:BeanPostProcessor 接口
BeanPostProcessor 接口也被称为后置处理器,通过该接口可以自定义调用初始化前后执行的操作方法。
BeanPostProcessor 接口源码如下:
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
该接口中包含了两个方法:
- postProcessBeforeInitialization() 方法:在 Bean 实例化、属性注入后,初始化前调用。
- postProcessAfterInitialization() 方法:在 Bean 实例化、属性注入、初始化都完成后调用。
二、一个简单的例子
1.HelloWorld.java
package com.forcoldplay.spring.test03;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Message : " + message);
}
public void init(){
System.out.println("Bean 正在被初始化");
}
public void destroy(){
System.out.println("Bean 要被销毁");
}
}
2.InitHelloWorld.java
这是实现 BeanPostProcessor 的非常简单的例子,它在任何 bean 的初始化的之前和之后输入该 bean 的名称。你可以在初始化 bean 的之前和之后实现更复杂的逻辑,因为你有两个访问内置 bean 对象的后置处理程序的方法。
package com.forcoldplay.spring.test03;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class InitHelloWorld implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之前 : " + beanName);
return bean; // you can return any other object as well
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之后 : " + beanName);
return bean; // you can return any other object as well
}
}
3.MainApp.java
AbstractApplicationContext 类中声明的关闭 hook 的 registerShutdownHook() 方法,它将确保正常关闭,并且调用相关的 destroy 方法。
package com.forcoldplay.spring.test03;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld03");
obj.getMessage();
context.registerShutdownHook();
}
}
4.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-3.0.xsd">
<bean id="helloWorld" class="com.forcoldplay.spring.test.HelloWorld">
<property name="message" value="Hello World!"/>
</bean>
<bean id="helloWorld02" class="com.forcoldplay.spring.test02.HelloWorld" scope="singleton">
</bean>
<bean id="helloWorld03" class="com.forcoldplay.spring.test03.HelloWorld"
init-method="init" destroy-method="destroy">
<property name="message" value="Hello World!"/>
</bean>
<bean class="com.forcoldplay.spring.test03.InitHelloWorld" />
</beans>
5.运行结果
初始化之前 : helloWorld03
Bean 正在被初始化
初始化之后 : helloWorld03
Message : Hello World!
Bean 要被销毁