对于注解注入的bean,需要在xml中配置
<context:component-scan base-package="com.XXX"/>
<context:annotation-config/>
我们看下compoent-scan的注释

可以看出来component-scan不仅能完成bean定义,还可以自动注入bean,所以只要配置一个即可。
Spring在DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions中解析bean时,对于注解注入的bean采用parseCustomElement方式解析。

委托给BeanDefinitionParserDelegate来解析。

NamespaceHandler通过子类NamespaceHandlerSupport完成解析。

不同的标签由不同的BeanDefinitionParser来解析。对于component-scan来说,是由ComponentScanBeanDefinitionParser执行。

(1)首先获取context:component-scan 配置的属性base-package的值,然后放到数组。
(2)创建扫描对应包下的class和jar文件的对象ClassPathBeanDefinitionScanner ,由这个类来实现扫描包下的class和jar文件并把注解的Bean包装成BeanDefinition。
(3)BeanDefinition注册到Bean工厂。
以下为具体解析和注册过程:

1、首先找到待注入的bean

(1)先把base-package下的路径进行转换,并扫描package下的jar和class并封装成resource
(2)过滤<context:exclude-filter>包下的class
(3)包装beanDefinition,放到队列里
2、把beanDefinition包装成BeanDefinitionHolder
3、注册bean,由DefalutListableBeanDefnitionRegistry来完成

网友评论