在通过BeanFactoryPostProcessor来手动干预springbean加载状态时,有两点需要注意:
-
是否需要实现PriorityOrdered接口。
spring处理BeanFactoryPostProcessor类型的bean,主要是通过AbstractApplicationContext中的invokeBeanFactoryPostProcessors来处理,主要代码如下:
实现了PriorityOrdered接口的Processor会放在第一优先级队列中执行,并且通过设置优先级,可以执行Processor的执行顺序(注意:Spring自带的Processor都被默认设置了最低优先级)。
是否需要初始化bean
ListableBeanFactory中有个重要的接口getBeanNamesForTypes
,该接口支持两种传参类型,若不希望在调用接口后会触发bean的初始化工作,需使用String[] getBeanNamesForType(Class type, boolean includeNonSingletons, boolean allowEagerInit)
,并将最后的allowEagerInit参数置为true。