BeanPostProcessor
其两个方法
1 postProcessBeforeInitialization
在bean的构造方法执行完,且其属性已经被填充,还没有执行afterPropertiesSet(如果有)和init-method(如果有)之前,被spring回调来执行。
2 postProcessAfterInitialization
在bean的afterPropertiesSet(如果有)和init-method(如果有)执行完之后,被spring回调执行。
但是要注意如果FactoryBean,那么在getObject方法产生bean的时候,这个方法会被调用两次,一次是生成FactoryBean的时候,在一个就是getObject的时候。可以通过bean instanceof FactoryBean方法来自定义是否要执行两次。
如果某个BeanPostProcessor的postProcessAfterInitialization方法返回的bean为null,那么后续的BeanPostProcessor的postProcessAfterInitialization不会继续的执行。
InstantiationAwareBeanPostProcessor
继承于BeanPostProcessor,此类一般spring内部使用
1 postProcessBeforeInstantiation
在bean调用构造函数实例化之前被调用,如果返回的值不为null,那么会跳过默认的实例化过程(可以实现定制化的实例化过程)
2 postProcessAfterInstantiation
在bean通过构造函数或是工厂方法实例化之后被回掉,这个时候属性还没有被填充,默认返回true,如果返回true,继续的执行填充属性的流程,如果返回false,不会填充属性,且后续的InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation也不会被执行。
SmartInstantiationAwareBeanPostProcessor
继承于InstantiationAwareBeanPostProcessor,所谓的smart就是带有了预言和检测的能力。
提供了几个默认的方法
1 predictBeanType 预判执行postProcessBeforeInstantiation之后返回的类型,默认是null
2 determineCandidateConstructors 检查这个bean的构造函数
3 getEarlyBeanReference 返回一个 early的引用类型,在bean之间有循环依赖的时候很有用。
以上提供的三个interface一般用的比较少,我们可以使用spring提供给我们的一个已经实现了上面接口的适配类
InstantiationAwareBeanPostProcessorAdapter,就是把上面的接口都默认实现了,我们只要重写其中的方法就可以了。下面一张图来展示接口中各个回调方法的执行时机。
openapi (3).png
可以看到在生成bean的各个点spring都提供了钩子方法,我们可以很方便的插入我们的自定义的逻辑。
网友评论