對于注解注入的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
不同的標(biāo)簽由不同的BeanDefinitionParser來解析句伶。對于component-scan來說劲蜻,是由ComponentScanBeanDefinitionParser執(zhí)行。
image.png
(1)首先獲取context:component-scan 配置的屬性base-package的值考余,然后放到數(shù)組先嬉。
(2)創(chuàng)建掃描對應(yīng)包下的class和jar文件的對象ClassPathBeanDefinitionScanner ,由這個類來實現(xiàn)掃描包下的class和jar文件并把注解的Bean包裝成BeanDefinition楚堤。
(3)BeanDefinition注冊到Bean工廠疫蔓。
以下為具體解析和注冊過程:
image.png
1、首先找到待注入的bean
image.png
(1)先把base-package下的路徑進(jìn)行轉(zhuǎn)換身冬,并掃描package下的jar和class并封裝成resource
(2)過濾<context:exclude-filter>包下的class
(3)包裝beanDefinition衅胀,放到隊列里
2、把beanDefinition包裝成BeanDefinitionHolder
3吏恭、注冊bean拗小,由DefalutListableBeanDefnitionRegistry來完成
image.png