前言
AnnotationConfigApplicationContext 构造函数除了初始化一个 reader
,还有一个 scanner
,上面来一起看看 ClassPathBeanDefinitionScanner
都有什么逻辑。
源码剖析
this.scanner = new ClassPathBeanDefinitionScanner(this);
代码如下所示:
其中 useDefaultFilters
默认设置的 true。所以最终会执行上面三局部代码:
- registerDefaultFilters();
- setEnvironment(environment);
- setResourceLoader(resourceLoader);
再来看下 UML:
ClassPathBeanDefinitionScanner
继承了 ClassPathScanningCandidateComponentProvider
,而下面说的这三个办法,其实都是父类 ClassPathScanningCandidateComponentProvider
的办法。
对应的这三个操作就是给它的参数赋值:
registerDefaultFilters
本步骤次要是增加过滤器,对 includeFilters 赋值。注册过滤器 @Component
,@Controller
@Service
、@Repository
也会被增加进去。
也会注册增加 JSR-250 的 @ManagedBean 和 JSR-330 的 @Named 注解。
setEnvironment
setResourceLoader
setEnvironment
和 setResourceLoader
赋值操作,基本上如代码所示。
总结
这一步次要是初始化类扫描器,在它初始化的时候,会初始化一些须要被扫描的注解,以及资源加载器。
到此,无参结构曾经执行结束。总结一下,这两局部别离是初始化默认的处理器,以及初始化类扫描器,资源加载器。
相干举荐
- Spring 源码学习 06:AnnotatedBeanDefinitionReader
- Spring 源码学习 05:BeanDefinition 概念及其实现
- Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory