spring源码学习(六)注册beanPostProcessor与消息资源初始化
1、注册beanPostProcessor
这个方法的处理逻辑与invokeBeanFactoryPostProcessors里的注册处理逻辑一致
1)、先从容器中获取获取所以bppName的集合
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
2)、在根据priorityOrdered、ordered、nonOrdered以及internal的方式分类排序进行注册
internalPostProcessors这个分类主要是针对的MergedBeanDefinitionPostProcessor,而这个beanPostProcessor的作用主要是在bean实例化完成之后去修改bean的定义信息,包括AutowiredAnnotationBeanPostProcessor(解析@Autowired、@Value)CommonAnnotationBeanPostProcessor(解析@PostStruct、@PreDestory、@Resource)都可以修改beanDefinition
3)、这里在统计beanPostProcessor的时候为什么要加1,加1的目的就是为了后面紧接着添加的beanPostProcessor
4)、在方法的结束为什么又要重新添加一次ApplicationListenerDetector。第一次在prepareBeanFactory的添加,第二次在注册beanPostProcessor的时候添加
ApplicationListenerDetector的目的是为了记录beanfactory中单例对象,在prepareBeanFactory中提前添加的目的是因为在注册beanPostProcessor之前会实例化一些bean,方便记录单例信息
第二次添加在所以的beanPostProcessor的最后位置,也是为了最后执行,方便记录信息
2、消息资源初始化initMessageSource
这个方法在纯spring中几乎没什么作用,在springMVC器重要作用,而这个方法的目的是支持消息的参数化和国际化
initMessageSource内部执行也很简单
1)、判断beanFactory中是否messageSource这个bean,如果存在再判断是否有父容器,如果没有父 MessageSource,则仅将父上下文设置为父 MessageSource
2)、如果不存在就创建一个DelegatingMessageSource消息类放到容器中