BeanDefinition
Bean的定義是掰,在Spring中鹦倚,我們可以如何去定義一個Bean?
? ? 1、<bean/>
? ? 2冀惭、@Bean
? ? 3震叙、@Component(@Service,@Controller)
我們通過<bean/>,@Bean散休,@Component等方式所定義的Bean媒楼,最終都會被解析為BeanDefinition對象。BeanDefinition可以理解為底層源碼級別的一個概念戚丸,也可以理解為Spring提供的一種API使用的方式划址。
BeanDefinitionReader
BeanDefinitionReader分為幾類:
AnnotatedBeanDefinitionReader
可以直接把某個類轉(zhuǎn)換為BeanDefinition扔嵌,并且會解析該類上的注解
注意:它能解析的注解是:@Conditional,@Scope夺颤、@Lazy痢缎、@Primary、@DependsOn世澜、@Role独旷、@Description
XmlBeanDefinitionReader
可以解析<bean/>標簽
ClassPathBeanDefinitionScanner
這個并不是BeanDefinitionReader,但是它的作用和BeanDefinitionReader類似寥裂,它可以進行掃描嵌洼,掃描某個包路徑,對掃描到的類進行解析封恰,比如麻养,掃描到的類上如果存在@Component注解,那么就會把這個類解析為一個BeanDefinition
BeanFactory
Spring中比較核心的是BeanFactory的實現(xiàn)類是DefaultListableBeanFactory
它實現(xiàn)了很多接口诺舔,表示鳖昌,它擁有很多功能:
1、AliasRegistry:支持別名功能低飒,一個名字可以對應多個別名
2遗遵、BeanDefinitionRegistry:可以注冊、保存逸嘀、移除车要、獲取某個BeanDefinition
3、BeanFactory:Bean工廠崭倘,可以根據(jù)某個bean的名字翼岁、或類型、或別名獲取某個Bean對象
4司光、SingletonBeanRegistry:可以直接注冊琅坡、獲取某個單例Bean
5、SimpleAliasRegistry:它是一個類残家,實現(xiàn)了AliasRegistry接口中所定義的功能榆俺,支持別名功能
6、ListableBeanFactory:在BeanFactory的基礎上坞淮,增加了其他功能茴晋,可以獲取所有BeanDefinition的beanNames,可以根據(jù)某個類型獲取對應的beanNames回窘,可以根據(jù)某個類型獲取{類型:對應的Bean}的映射關系
7诺擅、HierarchicalBeanFactory:在BeanFactory的基礎上,添加了獲取父BeanFactory的功能
8啡直、DefaultSingletonBeanRegistry:它是一個類烁涌,實現(xiàn)了SingletonBeanRegistry接口苍碟,擁有了直接注冊、獲取某個單例Bean的功能
9撮执、ConfigurableBeanFactory:在HierarchicalBeanFactory和SingletonBeanRegistry的基礎上微峰,添加了設置父BeanFactory、類加載器(表示可以指定某個類加載器進行類的加載)抒钱、設置Spring EL表達式解析器(表示該BeanFactory可以解析EL表達式)蜓肆、設置類型轉(zhuǎn)化服務(表示該BeanFactory可以進行類型轉(zhuǎn)化)、可以添加BeanPostProcessor(表示該BeanFactory支持Bean的后置處理器)继效,可以合并BeanDefinition症杏,可以銷毀某個Bean等等功能
10装获、FactoryBeanRegistrySupport:支持了FactoryBean的功能
11瑞信、AutowireCapableBeanFactory:是直接繼承了BeanFactory,在BeanFactory的基礎上穴豫,支持在創(chuàng)建Bean的過程中能對Bean進行自動裝配
12凡简、AbstractBeanFactory:實現(xiàn)了ConfigurableBeanFactory接口,繼承了FactoryBeanRegistrySupport精肃,這個BeanFactory的功能已經(jīng)很全面了秤涩,但是不能自動裝配和獲取beanNames
13、ConfigurableListableBeanFactory:繼承了ListableBeanFactory司抱、AutowireCapableBeanFactory筐眷、ConfigurableBeanFactory
14、AbstractAutowireCapableBeanFactory:繼承了AbstractBeanFactory习柠,實現(xiàn)了AutowireCapableBeanFactory匀谣,擁有了自動裝配的功能
15、DefaultListableBeanFactory:繼承了AbstractAutowireCapableBeanFactory资溃,實現(xiàn)了ConfigurableListableBeanFactory接口和BeanDefinitionRegistry接口武翎,所以DefaultListableBeanFactory的功能很強大
ApplicationContext
首先ApplicationContext是個接口,可以把它理解為一個特殊的BeanFactory
1溶锭、HierarchicalBeanFactory:擁有獲取父BeanFactory的功能
2宝恶、ListableBeanFactory:擁有獲取beanNames的功能
3、ResourcePatternResolver:資源加載器趴捅,可以一次性獲取多個資源(文件資源等等)
4垫毙、EnvironmentCapable:可以獲取運行時環(huán)境(沒有設置運行時環(huán)境功能)
5、ApplicationEventPublisher:擁有廣播事件的功能(沒有添加事件監(jiān)聽器的功能)
6拱绑、MessageSource:擁有國際化功能
有兩個比較重要的實現(xiàn)類:
1露久、AnnotationConfigApplicationContext
2、ClassPathXmlApplicationContext
AnnotationConfigApplicationContext
1欺栗、ConfigurableApplicationContext:繼承了ApplicationContext接口毫痕,增加了征峦,添加事件監(jiān)聽器、添加BeanFactoryPostProcessor消请、設置Environment栏笆,獲取ConfigurableListableBeanFactory等功能
2、AbstractApplicationContext:實現(xiàn)了ConfigurableApplicationContext接口
3臊泰、GenericApplicationContext:繼承了AbstractApplicationContext蛉加,實現(xiàn)了BeanDefinitionRegistry接口,擁有了所有ApplicationContext的功能缸逃,并且可以注冊BeanDefinition针饥,注意這個類中有一個屬性(DefaultListableBeanFactory?beanFactory)
4、AnnotationConfigRegistry:可以單獨注冊某個為類為BeanDefinition(可以處理該類上的@Configuration注解需频,已經(jīng)可以處理@Bean注解)丁眼,同時可以掃描
5、AnnotationConfigApplicationContext:繼承了GenericApplicationContext昭殉,實現(xiàn)了AnnotationConfigRegistry接口苞七,擁有了以上所有的功能
ClassPathXmlApplicationContext
BeanPostProcessor
Bean的后置處理器,可以在創(chuàng)建每個Bean的過程中進行干涉挪丢,是屬于BeanFactory中一個屬性蹂风。
BeanFactoryPostProcessor
Bean工廠的后置處理器,是屬于ApplicationContext中的一個屬性乾蓬,是ApplicationContext在實例化一個BeanFactory后惠啄,可以利用BeanFactoryPostProcessor繼續(xù)處理BeanFactory。
FactoryBean
允許程序員自定義一個對象通過FactoryBean間接的放到Spring容器中成為一個Bean任内。