Bean的后置处理器详解:
Spring当中的后置处理器是Spring体用的一个扩展点,开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例化的一个过程,怎么插手呢?
它是在我们bean被放到Spring Bean容器之前去做一个插手,也就是说可以对我们的bean做一个改变。
Spring 在实例化单例Bean的过程中,会在9个地方执行5个后置处理器。
第一个后置处理器:
BeanPostProcessor
bean工厂的bean属性处理容器,就是可以管理我们的bean工厂内所有的beandefinition(未实例化)数据,可以随心所欲的修改属性。它有下面两个方法:
方法 | 说明 |
postProcessBeforeInitialization | 初始化之前完成一些定制的业务逻辑 |
postProcessAfterInitialization | 初始化完毕时执行的业务逻辑 |
第二个后置处理器:
InstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor接口继承BeanPostProcessor接口,它内部提供了3个方法,再加上BeanPostProcessor接口内部提供的2个方法,所以实现这个接口需要实现5个方法。InstantiationAwareBeanPostProcessor接口的主要作用在于目标对象的实例化过程中需要处理的事情,包括实例化对象的前后过程以及实例的属性设置。
方法 | 说明 |
postProcessBeforeInstantiation() | 在目标对象实例化之前调用,方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未被实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(一般是代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessorAfterIniaialization方法会调用,其他方法不再调用,否则按照正常流程走。 |
postProcessAfterInstantiation() | 方法在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。如果该方法的返回值是false,会忽略属性值的设置;如果返回true,会按照正常流程设置属性值。方法不管postProcessBeforeInstantiation()返回什么都会执行 |
postProcessPropertyValues() | 方法对属性值进行修改(这个时候属性值还未被设置,但是我们可以修改原本该设置进去的属性值)如果postProcessAfterInstantiation()返回false,该方法不会被调用 |
第三个后置处理器:
SmartInstantiationAwareBeanPostProcessor
智能实例化Bean后置处理器(继承InstantiationAwareBeanPostProcessor),内部提供了3个方法
方法 | 说明 |
determineCandidateConstructors() | 监测Bean的构造器 |
predictBeanType() | 预测bean的类型 |
getEarlyBeanReference() | 循环引用的后置处理器,这个比较复杂,获取提前暴露的bean引用。主要用于解决循环引用的问题。只有单例对象才会调用此方法。 |
第四个后置处理器:
MergedBeanDefinitionPostProcessor
合并bean信息,或者说合并属性的后置处理器
方法 | 说明 |
postProcessMergedBeanDefinition() | 缓存bean注入信息的后置处理器,仅仅是缓存或者说是查询,没有完成注入,注入是另外一个后置处理器的作用 |