从Spring容器中找出实现了BeanPostProcessor接口的bean,并设置到BeanFactory的属性中。之后bean被实例化的时候会调用这个BeanPostProcessor。
该方法委托给了PostProcessorRegistrationDelegate类的registerBeanPostProcessors方法执行。1
2
3protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
registerBeanPostProcessors代码如下:
1 | public static void registerBeanPostProcessors( |
注册完成后,beanFactory的beanPostProcessors中有7个BeanPostProcessor:
- ApplicationContextAwareProcessor
- ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
- PostProcessorRegistrationDelegate$BeanPostProcessorChecker
- CommonAnnotationBeanPostProcessor
- AutowiredAnnotationBeanPostProcessor
- RequireAnnotationBeanPostProcessor
- ApplicationListenerDetector
这里的过程跟invokeBeanFactoryPostProcessors类似:
- 先找出实现了PriorityOrdered接口的BeanPostProcessor并排序后加到BeanFactory的BeanPostProcessor集合中
- 找出实现了Ordered接口的BeanPostProcessor并排序后加到BeanFactory的BeanPostProcessor集合中
注册BeanPostProcessor的代码如下,PostProcessorRegistrationDelegate.registerBeanPostProcessors
:
1 | private static void registerBeanPostProcessors(ConfigurableListBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) { |
真正调用的函数是AbstractBeanFactory.addBeanPostProcessor
:
1 | public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { |
可以看到,beanPostProcessor被保存在AbstractBeanFactory中的List<BeanPostProcessor> beanPostProcessors
registerBeanPostProcessors中用到的几个函数
getBeanNamesForType
beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false)
获取匹配BeanPostProcessor类型的bean名称。
调用的是DefaultListableBeanFactory.getBeanNamesForType
1 | public String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit) { |
真正工作的是同一个类下的doGetBeanNamesForType
:
1 | private String[] doGetBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit) { |
getMergedLocalBeanDefinition
获取bean的RootBeanDefinition,如果bean有父类则合并父类的定义,否则返回bean本身的定义:
1 | protected RootBeanDefinition getMergedBeanDefinition( |
isTypeMatch
isTypeMatch
判断名称为beanName的bean是否是type类型:
1 | public boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException { |
判断是否符合类型的方法主要是Resolvable.isInstance
:
1 | public boolean isInstance(Object obj) { |
1 | private boolean isAssignableFrom(ResolvableType other, Map<Type, Type> matchedBefore) { |
ClassUtils.isAssignable
代码如下:
1 | public static boolean isAssignable(Class<?> lhsType, Class<?> rhsType) { |