文章目录
BeanDefinition
BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如:
class,表示Bean类型
scope,表示Bean作用域,单例或原型等
lazyInit:表示Bean是否是懒加载
initMethodName:表示Bean初始化时要执行的方法
destroyMethodName:表示Bean销毁时要执行的方法
还有很多…
在Spring中,我们经常会通过以下几种方式来定义Bean:
- @Bean
- @Component(@Service,@Controller)
这些,我们可以称之申明式定义Bean。
我们还可以编程式定义Bean。
和申明式事务、编程式事务类似,通过,@Bean,@Component等申明式方式所定义的
Bean,最终都会被Spring解析为对应的BeanDefinition对象,并放入Spring容器中。
BeanDefinitionReader
接下来,我们来介绍几种在Spring源码中所提供的BeanDefinition读取器
(BeanDefinitionReader),这些BeanDefinitionReader在我们使用Spring时用得少,但在Spring
源码中用得多,相当于Spring源码的基础设施。
AnnotatedBeanDefinitionReader
可以直接把某个类转换为BeanDefinition,并且会解析该类上的注解。
注意:它能解析的注解是:@Conditional,@Scope、@Lazy、@Primary、@DependsOn、
@Role、@Description
XmlBeanDefinitionReader
可以解析标签
ClassPathBeanDefinitionScanner
ClassPathBeanDefinitionScanner是扫描器,但是它的作用和BeanDefinitionReader类似,它可以
进行扫描,扫描某个包路径,对扫描到的类进行解析,比如,扫描到的类上如果存在@Component
注解,那么就会把这个类解析为一个BeanDefinition。
BeanFactory
BeanFactory表示Bean工厂,所以很明显,BeanFactory会负责创建Bean,并且提供获取Bean的
API。
而ApplicationContext是BeanFactory的一种。
首先,在Java中,接口是可以多继承的,我们发现ApplicationContext继承了ListableBeanFactory
和HierarchicalBeanFactory,而ListableBeanFactory和HierarchicalBeanFactory都继承至
BeanFactory,所以我们可以认为ApplicationContext继承了BeanFactory,相当于苹果继承水果,
宝马继承汽车一样,ApplicationContext也是BeanFactory的一种,拥有BeanFactory支持的所有功
能,不过ApplicationContext比BeanFactory更加强大,ApplicationContext还基础了其他接口,也
就表示ApplicationContext还拥有其他功能,比如MessageSource表示国际化,
ApplicationEventPublisher表示事件发布,EnvironmentCapable表示获取环境变量,等等,关于
ApplicationContext后面再详细讨论。
在Spring的源码实现中,当我们new一个ApplicationContext时,其底层会new一个BeanFactory出
来,当使用ApplicationContext的某些方法时,比如getBean(),底层调用的是BeanFactory的
getBean()方法。
在Spring源码中,BeanFactory接口存在一个非常重要的实现类是:
*DefaultListableBeanFactory,也是非常核心的。*具体重要性,随着后续课程会感受更深。
所以,我们可以直接来使用DefaultListableBeanFactory,而不用使用ApplicationContext的某个
实现类。
DefaultListableBeanFactory是非常强大的,支持很多功能,可以通过查看
DefaultListableBeanFactory的类继承实现结构来看
它实现了很多接口,表示,它拥有很多功能:
- AliasRegistry:支持别名功能,一个名字可以对应多个别名
- BeanDefinitionRegistry:可以注册、保存、移除、获取某个BeanDefinition
- BeanFactory:Bean工厂,可以根据某个bean的名字、或类型、或别名获取某个Bean对象
- SingletonBeanRegistry:可以直接注册、获取某个单例Bean
- SimpleAliasRegistry:它是一个类,实现了AliasRegistry接口中所定义的功能,支持别名功能
- ListableBeanFactory:在BeanFactory的基础上,增加了其他功能,可以获取所有
BeanDefinition的beanNames,可以根据某个类型获取对应的beanNames,可以根据某个类
型获取{类型:对应的Bean}的映射关系 - HierarchicalBeanFactory:在BeanFactory的基础上,添加了获取父BeanFactory的功能
- DefaultSingletonBeanRegistry:它是一个类,实现了SingletonBeanRegistry接口,拥有了直
接注册、获取某个单例Bean的功能 - ConfigurableBeanFactory:在HierarchicalBeanFactory和SingletonBeanRegistry的基础上,
添加了设置父BeanFactory、类加载器(表示可以指定某个类加载器进行类的加载)、设置
Spring EL表达式解析器(表示该BeanFactory可以解析EL表达式)、设置类型转化服务(表示
该BeanFactory可以进行类型转化)、可以添加BeanPostProcessor(表示该BeanFactory支持
Bean的后置处理器),可以合并BeanDefinition,可以销毁某个Bean等等功能 - FactoryBeanRegistrySupport:支持了FactoryBean的功能
- AutowireCapableBeanFactory:是直接继承了BeanFactory,在BeanFactory的基础上,支持
在创建Bean的过程中能对Bean进行自动装配 - AbstractBeanFactory:实现了ConfigurableBeanFactory接口,继承了
FactoryBeanRegistrySupport,这个BeanFactory的功能已经很全面了,但是不能自动装配和
获取beanNames - ConfigurableListableBeanFactory:继承了ListableBeanFactory、
AutowireCapableBeanFactory、ConfigurableBeanFactory - AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory,实现了
AutowireCapableBeanFactory,拥有了自动装配的功能 - DefaultListableBeanFactory:继承了AbstractAutowireCapableBeanFactory,实现了
ConfigurableListableBeanFactory接口和BeanDefinitionRegistry接口,所以
DefaultListableBeanFactory的功能很强大
ApplicationContext
上面有分析到,ApplicationContext是个接口,实际上也是一个BeanFactory,不过比BeanFactory
更加强大,比如:
- HierarchicalBeanFactory:拥有获取父BeanFactory的功能
- ListableBeanFactory:拥有获取beanNames的功能
- ResourcePatternResolver:资源加载器,可以一次性获取多个资源(文件资源等等)
- EnvironmentCapable:可以获取运行时环境(没有设置运行时环境功能)
- ApplicationEventPublisher:拥有广播事件的功能(没有添加事件监听器的功能)
- MessageSource:拥有国际化功能