一、什么是BeanPostProcessor?
所谓的BeanPostProcessor其实是Spring为咱们关上的一个窗口,就犹如拦截器一样,在bean对象初始化之前和初始化实现之后,能够对bean进行进一步的包装;
BeanPostProcessor的作用: 对Spring工厂所创立的对象,进行再加工,它也成就了AOP的实现
BeanPostProcessor实质上就是一个接口,通过实现这个接口的办法,就能对Bean进行包装
备注:在上图中一个bean的创立首先会调用类的无参结构,而后注入(DI),再而后进入到了postProcessBeforeInitialization,再到初始化bean,初始化实现后再去到postProcessAfterInitiazation中,最初给到调用者,留神办法中的两个参数Object bean 就为Spring创立的bean对象,而beanName为咱们在标签中申明的id值
1.1 实战留神
在实战中,咱们很少去解决Spring的初始化操作,所以没必要辨别Before办法或者After办法,咱们只须要在将bean给到调用者前,对bean进行包装就达到咱们的目标,所以咱们只须要实现一个After办法即可
然而咱们须要留神的是,Before办法能够不做任何对bean的加工操作,然而必须return bean对象
二、实战步骤
第一步: 书写你的BeanPostProcessor 类继承 BeanPostProcessor 接口,并重写办法
public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { //如果这个办法外部没有对bean做任何解决,须要击鼓传花似地将bean返回 return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof Catagory) { ((Catagory) bean).setName("Paul-Paul"); ((Catagory) bean).setOrder(25); } return bean; }}
第二步: 创立你的bean对象(因为过于简略,这里不展现了)
第三步:在配置文件中注入测试的bean和处理器bean
<!--1. 注入Catagory对象--><bean id="catagory" class="cn.paul.spring.demo.hellospring.entity.Catagory"> <property name="name" value="Jack"/> <property name="order" value="18"/></bean><!--2. 申明BeanPostProcessor--><bean id="myPostProess" class="cn.paul.spring.demo.hellospring.process.MyBeanPostProcessor"/><!--3. 注入另一个对象,做比照试验--><bean id="user" class="cn.paul.spring.demo.hellospring.entity.User"/>