2. spring ApplicationContext创建流程
2021-04-16 17:51:00 4 举报
AnnotationConfigApplicationContext的创建流程
作者其他创作
大纲/内容
再来聊一下这个对象,其实在ConfigurationClassPostProcessor里面在解析的时候并未使用这个对象,而是重新new了一个对象,这样的目的在于:ClassPathBeanDefinitionScanner扫描calss->bd的过程是核心流程是不应该对外开放的,但是其includeFilter|excludeFilter是需要对外扩展的总之:对扩展开放,对修改关闭(开闭原则-Open Close Principle)
this()
registerDefaultFilters();
1.CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME 这个最重要的一个BeanFactoryPostProcessor处理器,我们class-bd的过程,config类的解析加载2. AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME 这个主要用来处理:Autowired的注解处理器3. COMMON_ANNOTATION_PROCESSOR_BEAN_NAME 这个主要用来处理:JSR-250规范里面的注解(eg:Inject注解)4. PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME 这个主要用来处理:JPA相关的注解5. EVENT_LISTENER_PROCESSOR_BEAN_NAME 这个主要用来处理:和事件相关的6. EVENT_LISTENER_FACTORY_BEAN_NAME 这个也是和事件相关的
ClassPathBeanDefinitionScanner#ClassPathBeanDefinitionScanner()
new ClassPathBeanDefinitionScanner(this)
new AnnotatedBeanDefinitionReader(this);
new AnnotationConfigApplicationContext
在这里我们有一个思想是需要去了解的,spring加载bd、加载各种扩展点(BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor、BeanPostProcessor…)等都会从两个方面去找1. 直接从BeanFactory里面去找,这一部分spring本身内置的,或者是我们通过applicationContext.addBeanFacoryPostProcessor | register …2. 通过内置的处理器所找到的,所以spring会看到很多的递归、do-while理解上述的思想,会对我们理解spring的各个组件的执行时机会有很大的帮助
1,这里面就做了一件事:添加 includeFilters2. 这里做的添加会在后面的ClassPathScanningCandidateComponentProvider#isCandidateComponent这个里面做扫描类的时候会使用到
register(componentClasses)
AnnotationConfigUtils#registerAnnotationConfigProcessors()
这里面还可以看到spring的另外的一个思想, new AnnotationConfigApplicationContext其实里面添加了很多内置且必须的组件,但是通过简单的一个new就实现,这其实是:spring认为你不需要关注这些细节,所以就对你在使用这些api的时候屏蔽掉了这些细节。非常nice的设计
收藏
0 条评论
回复 删除
下一页