【spring底层架构核心原理】

BeanDefinition

BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如:
class,表示Bean类型
scope,表示Bean作用域,单例或原型等
lazyInit:表示Bean是否是懒加载
initMethodName:表示Bean初始化时要执行的方法
destroyMethodName:表示Bean销毁时要执行的方法
还有很多…
在Spring中,我们经常会通过以下几种方式来定义Bean:

  1. @Bean
  2. @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的类继承实现结构来看

它实现了很多接口,表示,它拥有很多功能:

  1. AliasRegistry:支持别名功能,一个名字可以对应多个别名
  2. BeanDefinitionRegistry:可以注册、保存、移除、获取某个BeanDefinition
  3. BeanFactory:Bean工厂,可以根据某个bean的名字、或类型、或别名获取某个Bean对象
  4. SingletonBeanRegistry:可以直接注册、获取某个单例Bean
  5. SimpleAliasRegistry:它是一个类,实现了AliasRegistry接口中所定义的功能,支持别名功能
  6. ListableBeanFactory:在BeanFactory的基础上,增加了其他功能,可以获取所有
    BeanDefinition的beanNames,可以根据某个类型获取对应的beanNames,可以根据某个类
    型获取{类型:对应的Bean}的映射关系
  7. HierarchicalBeanFactory:在BeanFactory的基础上,添加了获取父BeanFactory的功能
  8. DefaultSingletonBeanRegistry:它是一个类,实现了SingletonBeanRegistry接口,拥有了直
    接注册、获取某个单例Bean的功能
  9. ConfigurableBeanFactory:在HierarchicalBeanFactory和SingletonBeanRegistry的基础上,
    添加了设置父BeanFactory、类加载器(表示可以指定某个类加载器进行类的加载)、设置
    Spring EL表达式解析器(表示该BeanFactory可以解析EL表达式)、设置类型转化服务(表示
    该BeanFactory可以进行类型转化)、可以添加BeanPostProcessor(表示该BeanFactory支持
    Bean的后置处理器),可以合并BeanDefinition,可以销毁某个Bean等等功能
  10. FactoryBeanRegistrySupport:支持了FactoryBean的功能
  11. AutowireCapableBeanFactory:是直接继承了BeanFactory,在BeanFactory的基础上,支持
    在创建Bean的过程中能对Bean进行自动装配
  12. AbstractBeanFactory:实现了ConfigurableBeanFactory接口,继承了
    FactoryBeanRegistrySupport,这个BeanFactory的功能已经很全面了,但是不能自动装配和
    获取beanNames
  13. ConfigurableListableBeanFactory:继承了ListableBeanFactory、
    AutowireCapableBeanFactory、ConfigurableBeanFactory
  14. AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory,实现了
    AutowireCapableBeanFactory,拥有了自动装配的功能
  15. DefaultListableBeanFactory:继承了AbstractAutowireCapableBeanFactory,实现了
    ConfigurableListableBeanFactory接口和BeanDefinitionRegistry接口,所以
    DefaultListableBeanFactory的功能很强大

ApplicationContext

上面有分析到,ApplicationContext是个接口,实际上也是一个BeanFactory,不过比BeanFactory
更加强大,比如:

  1. HierarchicalBeanFactory:拥有获取父BeanFactory的功能
  2. ListableBeanFactory:拥有获取beanNames的功能
  3. ResourcePatternResolver:资源加载器,可以一次性获取多个资源(文件资源等等)
  4. EnvironmentCapable:可以获取运行时环境(没有设置运行时环境功能)
  5. ApplicationEventPublisher:拥有广播事件的功能(没有添加事件监听器的功能)
  6. MessageSource:拥有国际化功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值