registerBeanPostProcessors
通过PostProcessorRegistrationDelegate#registerBeanPostProcessors方法进行BeanPostProcessor 注册PostProcessors
有几点要说:
- MergedBeanDefinitionPostProcessor
- PriorityOrdered
- BeanPostProcessorChecker
- ApplicationListenerDetector
spring将BeanPostProcessor从不同的维度将BeanPostProcessor分类
- 依照接口PriorityOrdered,Ordered将BeanPostProcessor分为: 优先排序postProceesor, 排序postProceesor,和未排序postProceesor
- 依照接口MergedBeanDefinitionPostProcessor将BeanPostProcessor分为:内部使用BeanPostProcessor和非内部BeanPostProcessor
- 在BeanPostProcessor链的开始注入BeanPostProcessorChecker用于检查非法注入的BeanPostProcessor,registerBeanPostProcessors方法在开头部分已经将BeanPostProcessor的数量进行了限制,如果超过限制或者非基础设施角色或者不是BeanPostProcessor 即为非法
- ApplicationListenerDetector 为实现了ApplicationListener接口的类注册监听
另外,BeanFactory内部有判断一个对象名是否是一个接口的子类的方法isTypeMatch,该方法不受接口继承之类的影响。测试代码如下
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(SpringSourceTest.class);
ConfigurableListableBeanFactory beanFactory = configApplicationContext.getBeanFactory();
boolean dog = beanFactory.isTypeMatch("dog", Animal.class);
System.out.printf("dog%s%s \n",dog==true? "属于":"不属于", Animal.class.getSimpleName());
boolean worker = beanFactory.isTypeMatch("worker", Animal.class);
System.out.printf("worker%s%s \n",worker==true? "属于":"不属于", Animal.class.getSimpleName());
boolean worker2 = beanFactory.isTypeMatch("worker", Person.class);
system.out.printf("worker%s%s \n",worker2==true? "属于":"不属于", Person.class.getSimpleName());