关于java:Spring-BeanFactory-解析

5次阅读

共计 2699 个字符,预计需要花费 7 分钟才能阅读完成。

Spring

  • Spring 容器,通常指的是 ApplicationContext 体系结构;即整个 Spring 框架的 IOC 性能,是通过 ApplicationContext 接口的实现类来为应用程序服务的,应用程序通过 ApplicationContext 的办法来间接与 Bean 工厂交互,如获取 Bean 对象实例等
  • ApplicationContext 的顶层接口正是 beanFactory;因而,Spring 容器的实质也能够了解为 bean 工厂(beanFactory,或者 bean 容器),它依照咱们的要求,生产须要的各种 bean;在生产 bean 的过程中,为了解决 bean 之间的依赖问题,才引入了依赖注入 (DI) 这种技术;也就是说依赖注入是 beanFactory 生产 bean 时为了解决 bean 之间的依赖的一种技术而已

BeanDefinition

protected AbstractBeanDefinition(BeanDefinition original) {setParentName(original.getParentName());
    setBeanClassName(original.getBeanClassName());
    setScope(original.getScope());
    setAbstract(original.isAbstract());
    setFactoryBeanName(original.getFactoryBeanName());
    setFactoryMethodName(original.getFactoryMethodName());
    setRole(original.getRole());
    setSource(original.getSource());
    copyAttributesFrom(original);
    // 此处省略
}

从源码可知,BeanDefinition 其实是 Bean 的一些元数据定义,包含父类名称(parenName)、类名(baenClassName)、作用域(scope)等信息;

通过 BeanDefinitionReader 获取到 BeanDefinition 之后,咱们再通过 BeanDefinitionRegistry 将 beanDefinition 注册到 BeanFacory 中,存储在 BeanFactory 的 conCurrentHashMap 中,key=beanName,Value=BeanDefinition;

那么获取 Bean 就从 conCurrentHashMap 中通过 BeanName 获取对应的 Bean 信息

BeanDefinitionReader

bean 元数据读取器(或能够了解为解析器)
BeanDefinitionReader 会从 xml 文件;@Component 等注解类;@Configuration 等配置类,获取 BeanDefinition,而后注册到 BeanFactory 中;
留神,AnnotatedBeanDefinitionReader 并没有实现 BeanDefinitionReader,此处的 BeanDefinitionReader 泛指元数据读取器

BeanFactory

即 bean 工厂,所有开始的源头
在我学习 SpringBoot 启动的过程中上下文默认加载的是 DefaultListableBeanFactory,本文临时不进行深究,等前期有闲暇再来补完;

DefaultListableBeanFactory 是
BeanFactory 接口体系的默认实现类,提供 BeanDefinition 的存储 map,Bean 对象的存储 map;
而 Bean 对象实例的存储 map,定义在 FactoryBeanRegistrySupport,FactoryBeanRegistrySupport 实现了 SingletonBeanRegistry 接口,而 DefaultListableBeanFactory 的基类 AbstractBeanFactory,继承于 FactoryBeanRegistrySupport

BeanFactoryPostProcessor

  • BeanFactoryPostProcessor 是 BeanFactory 的后置处理器,BeanFactory 创立实现,加载其所蕴含的所有获取 BeanDefinition,但还没有实例化 bean 之前,执行,具体为调用 postProcessBeanFactory 办法
  1. 加载更多的 bean 元数据
    ConfigurationClassPostProcessor,用于从 BeanFactory 中检测应用了 @Configuration 注解的类,对于这些类对应的 BeanDefinitions 汇合,遍历并顺次交给 ConfigurationClassParser,ConfigurationClassBeanDefinitionReader 解决,别离是解决与 @Configuration 同时应用的其余注解和将类外部的应用 @Bean 注解的办法,生成 BeanDefinition,注册到 BeanFactory
  2. 对 bean 元数据进行加工解决
    BeanDefinition 属性填充 & 批改,在 postProcessBeanFactory 办法中,能够对 beanFactory 所蕴含的 beanDefinitions 的 propertyValues 和构造函数参数值进行批改,如应用 PropertyPlaceHolderConfigurer 来对 BeanDefinition 的 propertyValues 的占位符进行填充与赋值,或者应用 PropertyResourceConfigurer 获取 config 文件中属性,对 BeanDefinitions 的相干属性进行赋值或者值笼罩

BeanPostProcessor

  • BeanPostProcessor 是 bean 对象后置处理器,负责对已创立好的 bean 对象进行加工解决,次要是能够对新创建的 bean 实例进行批改,提供了一个相似于 hook 机制,对创立好的 bean 对象实例进行批改
  1. postProcessBeforeInitialization,创立完 bean 实例,在任何初始化办法执行之前,执行该办法
  2. postProcessAfterInitialization,创立完 bean 实例,在所有初始化办法执行之后,执行该办法

(未完)

参考资料:
https://blog.csdn.net/u010013…
https://blog.csdn.net/qq_3668…
https://blog.csdn.net/weixin_…

正文完
 0