Spring中有一个接口BeanPostProcessor,该接口我们叫后置处理器,作用是
在Bean对象实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。接口源码如下:一、自定义后置处理器
<code>public
class
MyBeanPostProcessor
implements
BeanPostProcessor
{public
ObjectpostProcessBeforeInitialization
(Object bean, String beanName)
throws
BeansException { System.out.println("初始化 before--实例化的bean对象:"
+beanName);return
bean; }public
ObjectpostProcessAfterInitialization
(Object bean, String beanName)
throws
BeansException { System.out.println("初始化 after...实例化的bean对象:"
+beanName);return
bean; } }/<code>
注:接口中两个方法不能返回null,如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象,因为后置处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中
然后定义实体类User:
<code>public
class
User
{private
int
id;private
String name;public
User
(){ System.out
.println("User 被实例化"
); }public
int
getId
() {
return
id; }public
void
setId
(int
id) {this
.id = id; }public
StringgetName
() {return
name; }public
void
setName
(String name
) { System.out
.println("设置name="
+name);this
.name = name; }public
void
customInit
(){ System.out
.println("User 中自定义的初始化方法"
); } }/<code>
再将User类配置成bean对象:
<code> (initMethod ="customInit"
)public
Useruser
()
{ User user =new
User(); user.setName("张三"
);return
user; }/<code>
这里也可以使用xml配置。
然后启动我们的项目,在控制台输出如下:
User 被实例化
设置name=张三
初始化 before--实例化的bean对象:user
User 中自定义的初始化方法
初始化 after...实例化的bean对象:user
通过输出语句我们能看到postProcessBeforeInitialization方法的输出语句是在Bean实例化及属性注入后执行的,且在自定义的初始化方法之前执行(通过Bean注解的initMethod指定)。而postProcessAfterInitialization方法是在自定义初始化方法执行之后执行的。
注意:
1.BeanFactory和ApplicationContext两个容器对待bean的后置处理器稍微有些不同。ApplicationContext容器会自动检测Spring配置文件中那些bean所对应的Java类实现了BeanPostProcessor接口,并自动把它们注册为后置处理器。在创建bean过程中调用它们,所以部署一个后置处理器跟普通的bean没有什么太大区别。
2.BeanFactory容器注册bean后置处理器时必须通过代码显示的注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法。
<code>ConfigurableBeanFactory factory =new
XmlBeanFactory(new
ClassPathResource("applicationContext.xml"
)); factory.addBeanPostProcessor(new
MyBeanPostProcessor());/<code>
二、多个后置处理器
我们可以在Spring中添加多个BeanPostProcessor(后置处理器)接口实现类,默认情况下Spring容器会根据后置处理器定义的顺序依次执行。
当然,如果你想指定后置处理器的调用顺序,那么你可以通过实现Ordered接口的getOrder方法来自定义顺序。该方法默认值为 0,优先级最高,值越大优先级越低。
<code>public
class
MyBeanPostProcessor2
implements
BeanPostProcessor
,Ordered
{public
ObjectpostProcessBeforeInitialization
(Object bean, String beanName)
throws
BeansException { System.out.println("第2个before--实例化的bean对象:"
+beanName);return
bean; }public
ObjectpostProcessAfterInitialization
(Object bean, String beanName)
throws
BeansException { System.out.println("第2个after...实例化的bean对象:"
+beanName);return
bean; }public
int
getOrder
()
{return
2
; } }/<code>