Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理。
?BeanPostProcessor
?接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等。你也可以在 ?Spring
? 容器通过插入一个或多个 ?BeanPostProcessor
? 的实现来完成实例化,配置和初始化一个?bean
?之后实现一些自定义逻辑回调方法。
你可以配置多个 ?BeanPostProcessor
?接口,通过设置 ?BeanPostProcessor
?实现的? Ordered
?接口提供的? order
? 属性来控制这些? BeanPostProcessor
? 接口的执行顺序。
?BeanPostProcessor
? 可以对? bean
?(或对象)实例进行操作,这意味着 ?Spring IoC
? 容器实例化一个 ?bean
? 实例,然后 ?BeanPostProcessor
? 接口进行它们的工作。
?ApplicationContext
? 会自动检测由 ?BeanPostProcessor
?接口的实现定义的 bean,注册这些 ?bean
? 为后置处理器,然后通过在容器中创建 ?bean
?,在适当的时候调用它。
?ApplicationContext
? 会自动检测由 ?BeanPostProcessor
? 接口的实现定义的 ?bean
?,注册这些? bean
? 为后置处理器,然后通过在容器中创建? bean
?,在适当的时候调用它。
在你自定义的的? BeanPostProcessor
? 接口实现类中,要实现以下的两个抽象方法 ?BeanPostProcessor.postProcessBeforeInitialization(Object, String)
? 和 ?BeanPostProcessor.postProcessAfterInitialization(Object, String)
? 和,注意命名要准确
否则会出现: ?“ The type InitHelloWorld must implement the inherited abstract method BeanPostProcessor.postProcessBeforeInitialization(Object, String) ”
?之类的错误
下面的例子显示如何在 ?ApplicationContext
? 的上下文中编写,注册和使用 ?BeanPostProcessor
?。
我们在适当的位置使用 Eclipse IDE,然后按照下面的步骤来创建一个 ?Spring
?应用程序:
步骤 | 描述 |
---|---|
1 | 创建一个名称为 ?SpringExample ? 的项目,并且在创建项目的? src ?文件夹中创建一个包 ?com.tutorialspoint ?。 |
2 | 使用? Add External JARs ?选项,添加所需的? Spring ? 库,解释见 ?Spring Hello World Example ?章节。 |
3 | 在 ?com.tutorialspoint ?包中创建 Java 类 ?HelloWorld ?、?InitHelloWorld ??和 ?MainApp ?。 |
4 | 在? src ?文件夹中创建? Beans ?配置文件? Beans.xml ?。 |
5 | 最后一步是创建的所有 Java 文件和 Bean 配置文件的内容,并运行应用程序,解释如下所示。 |
这里是 HelloWorld.java 文件的内容:
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
public void init(){
System.out.println("Bean is going through init.");
}
public void destroy(){
System.out.println("Bean will destroy now.");
}
}
这是实现? BeanPostProcessor
?的非常简单的例子,它在任何 ?bean
? 的初始化的之前和之后输入该 ?bean
? 的名称。你可以在初始化 ?bean
?的之前和之后实现更复杂的逻辑,因为你有两个访问内置 ?bean
? 对象的后置处理程序的方法。
这里是 InitHelloWorld.java 文件的内容:
package com.tutorialspoint;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.BeansException;
public class InitHelloWorld implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeforeInitialization : " + beanName);
return bean; // you can return any other object as well
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("AfterInitialization : " + beanName);
return bean; // you can return any other object as well
}
}
下面是 MainApp.java 文件的内容。在这里,你需要注册一个在 ?AbstractApplicationContext
? 类中声明的关闭? hook
? 的 ?registerShutdownHook()
?方法。它将确保正常关闭,并且调用相关的 ?destroy
? 方法。
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>
一旦你创建源代码和 ?bean
? 配置文件完成后,我们就可以运行该应用程序。如果你的应用程序一切都正常,将输出以下信息:
BeforeInitialization : helloWorld
Bean is going through init.
AfterInitialization : helloWorld
Your Message : Hello World!
Bean will destroy now.