对于注解注入的bean,需要在xml中配置
<context:component-scan base-package="com.XXX"/>
<context:annotation-config/>
我们看下compoent-scan的注释
image.png
可以看出来component-scan不仅能完成bean定义,还可以自动注入bean,所以只要配置一个即可。
Spring在DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions中解析bean时,对于注解注入的bean采用parseCustomElement方式解析。
image.png
委托给BeanDefinitionParserDelegate来解析。
image.png
NamespaceHandler通过子类NamespaceHandlerSupport完成解析。
image.png
不同的标签由不同的BeanDefinitionParser来解析。对于component-scan来说,是由ComponentScanBeanDefinitionParser执行。
image.png
(1)首先获取context:component-scan 配置的属性base-package的值,然后放到数组。
(2)创建扫描对应包下的class和jar文件的对象ClassPathBeanDefinitionScanner ,由这个类来实现扫描包下的class和jar文件并把注解的Bean包装成BeanDefinition。
(3)BeanDefinition注册到Bean工厂。
以下为具体解析和注册过程:
image.png
1、首先找到待注入的bean
image.png
(1)先把base-package下的路径进行转换,并扫描package下的jar和class并封装成resource
(2)过滤<context:exclude-filter>包下的class
(3)包装beanDefinition,放到队列里
2、把beanDefinition包装成BeanDefinitionHolder
3、注册bean,由DefalutListableBeanDefnitionRegistry来完成
image.png