@ComponentScan注解的作用是什么?
告知Spring扫描那些包下的类,可以配置includeFilters,excludeFilters,过滤某些类,更多内容可以具体看下此注解文件。
Spring是如何通过这个注解将类注入到Ioc容器中的?
请看截图:
1. createApplicationContext()方法创建IOC容器(AnnotationConfigServletWebServerApplicationContext),通过DEBUG可以查看到BeanFactory中BeanBefinitionMap中已经包含内容。
2. prepareContext(context, environment, listeners, applicationArguments, printedBanner);
执行完此方法后会将启动类添加到上图beanDefinitionMap中,提供给后续方法使用。
3. refreshContext(context),重点方法
此时的postProcessor是ConfigurationClassPostProcessor类,然后执行ConfigurationClassPostProcessor类中的postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 方法
执行ConfigurationClassParser类中的parse方法
通过启动类判断执行那一个方法
this.componentScanParser是。。。。看下图,在new ConfigurationClassParser是同时创建
执行ClassPathBeanDefinitionScanner类中的doScan方法
findCandidateComponents方法根据basePackage扫描出满足条件的类
registerBeanDefinition方法将扫描出来的类注册到beanFactory中
具体方法是registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
不显示配置时Spring为什么扫描的是启动类所在包下的类?
@SpringBootApplication是一个组合注解,包含了@ComponentScan注解,所以当我们没有在启动类上配置时@ComponentScan注解,Spring会默认以启动类所在包为扫描路径,哪里说明了呢?看下图:
在执行ComponentScanAnnotationParser类中的parse方法时,当@ComponentScan注解没有配置basePackages,basePackageClasses 属性时basePackages Set为空。
如果觉得有帮助的话,请打赏下博主吧!
大家可以关注下公众号: