Spring - Bean 的后置处理
BeanPostProcessor接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等.你也可以在Spring容器通过插入一个或者多个BeanPostProcessors的实现来完成实例化,配置和初始化一个bean之后实现一些自定义逻辑回调方法.
你可以配置多个BeanPostProcessor接口,通过BeanPostProcessor实现的Orclered接口提供的order属性来控制这些BeanPostProcessor即可的执行顺序.
BeanPostProcessor可以对bean(对象)实例进行操作,这意味着Spring IOC容器实例化一个bean实例,然后BeanPostProcessor接口进行他们的工作.
ApplicationContext会自动检测由BeanPostProcessor接口实现定义bean,注册这些bean为后置处理器,然后通过在容器中创建bean,在适当的时候调用它.
例子
步骤 | 描述 |
---|---|
1 | 创建一个名称为 SpringExample 的项目,并且在创建项目的 c 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("yout message : " + message);
}
public void init() {
System.out.println("Bean is going through init()......");
}
private void destroy() {
System.out.println("Bean will destroy now ......");
}
}
这时实现BeanPostProcessor的非常简单的例子,它在任何的初始化的之前和之后输入该bean的名称.你可以在初始化bean的之前和之后实现更复杂的逻辑,因为你有两个访问内置bean对象的后置处理程序的方法.
这里是InitHelloWorld.java文件内容
package com.tutorialspoint;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class InitHelloWorld implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("BeforeInitialization:"+beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("AfterInitialization:"+beanName);
return bean;
}
}
下面是MainApp.java文件的内容.在这里,你需要注册一个在AbstractApplicationContext类中声明的关闭hook的registerShutdownHook() 方法.它将确保正常关闭,并且调用相关的destroy方法.
MainApp.java
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 ........."></property>
</bean>
<bean class="com.tutorialspoint.InitHelloWorld"/>
</beans>
一旦创建源代码和bean配置文件完成后,我们就可以运行该应用程序.如果你的应用程序一切都正常,静输出一下信息.
AfterInitialization:helloWorld
Bean is going through init()......
BeforeInitialization:helloWorld
yout message : hello .........
Bean will destroy now ......
网友评论