Spring提供了两种后处理bean的扩展接口,分别是BeanFactoryPostProcessor和BeanPostProcessor。
区别:BeanPostProcessor接口的实现类是在java对象实例化之后,init-method方法之前创建。BeanFactoryPostProcessor的实现类是在java对象实例化之前就创建。
BeanPostProcessor
该接口提供两个方法,分别是init-method方法执行前处理和后处理。
需要注意一点,我们定义一个类实现了BeanPostProcessor,默认是会对整个Spring容器中所有的bean进行处理。
这两个方法都有参数Object和String,第一个参数是java对象实例,第二个是这个对象的name或id值。如果想针对某个bean进行初始化方法的前后处理,可以通过筛选name的值。
如果当前需要前后处理的类实现了InitializingBean接口的afterPropertiesSet方法,那postProcessBeforeInitialization方法会在afterPropertiesSet之前执行。
BeanFactoryPostProcessor
这个接口的参数是一个ConfigurableListableBeanFactory类型,通过源码我们可以找到这个类中有一个getBeanDefinition的方法。而BeanDefiniation类是用来描述我们bean的。
程序在执行过程中,先解析xml或注解,加载bean的信息,然后通过BeanFactoryPostProcessor的实现类创建一个BeanDefiniation对象,这个对象会根据bean标签的描述实例化一个java对象,并将java对象存入到一个Map(BeanDefiniationMap)中。
所以BeanFactoryPostProcessor的实现类是在加载时、java对象实例化之前做处理的。