BeanPostProcessor接口定义了回调方法你可以实现提供自己的实例化逻辑,依赖解析逻辑等等。你也可以实现一些定制的逻辑在Spring容器完成初始化、配置和实例化bean之后,通过安插一个或多个BeanPostProcessor的实现。
你可以配置多个BeanPostProcessor接口,你可以控制这些BeanPostPorcessor接口的执行顺序通过提供的BeanPostProcessor实现Ordered接口提供order属性。
BeanPostProcessors操作bean(或对象)实例意思是SpringIoC容器初始化bean实例然后BeanPostProcessor接口做它们的事情。
一个ApplicationContext自动的发现任何定义了BeanPostPorcessor接口实现的bean并且注册那些bean为post-processors(后处理程序),由容器适时的时候穿件他们。
示例
如下的例子展示如何在ApplicationConext上下文中,写、注册并使用BeanPostProcessors。
让我们按如下的步骤在Eclipse IDE中创建Spring应用。
步骤 | 描述 |
1 | 创建一个SpringExample的项目并在src目录下创建com.tutorialspoint包。 |
2 | 在Add External JARs选项卡中添加Spring库如在Spring Hello World章节中所讲。 |
3 | 在com.tutorialspoint包下创建HelloWorld、InitHelloWorld和MainApp类。 |
4 | 在src目录下创建bean的配置文件Beans.xml |
5 | 最后一步在Java类中和Bean配置文件中添加内容,并运行应用。 |
如下是HelloWorld.java的内容
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void init() {
System.out.println("Bean is going through init.");
}
public void destroy() {
System.out.println("Bean will destroy now.");
}
public void setMessage(String message) {
this.message = message;
}
public void getMessage() {
System.out.println("Your Message:" + message);
}
}
这是一个十分基础的实现BeanPostProcessor的例子,它会在实例化前和后打印所有bean的名字。你可以实现更复杂的逻辑在实例化bean之前和之后,因为你可以访问bean对象在post processor的两个方法中。
如下是InitHelloWorld源代码:
package com.tutorialspoint;
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("helloWorld");
obj.getMessage();
context.registerShutdownHook();
}
}
如下是含有init和destroy方法的配置文件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.tutorialspoint.HelloWorld"
init-method="init" destroy-method="destroy">
<property name="message" value="Hello World!"/>
</bean>
<bean class="com.tutorialspoint.InitHelloWorld" />
</beans>
一旦你完成了源代码的创建和配置文件,运行应用。如果应用一切正常将会输出如下消息:
BeforeInitialization:helloWorld
Bean is going through init.
AfterInitialization:helloWorld
Your Message:Hello World!
Bean will destroy now.