Spring核心组件

Spring总共有十几个组件,但真正核心的只有三个:Core、Context和Bean。我们将从这三个组件入手来分析Spring。

Spring三个核心组件之间的关系

Spring之中最重要的当属Bean了,Spring实际上就是面向Bean的编程,Bean对于Spring的意义就好比Object对于OOP的意义一样。那么,三个核心组件之间是如何协同工作的呢?如果把Bean比作一场演出中的演员,那么Context就是这场演出的舞台,Core就是演出的道具,至于演出的节目,就是Spring的一系列特色功能了。

我们知道Bean包裹的是Object,而Object中必然有数据,Context就是给这些数据提供生存环境,发现每个Bean之间的关系,为他们建立并维护好这种关系。这样来说,Context就是一个Bean关系的集合,这个关系集合就是我们所说的IOC容器。那么Core又有什么作用呢?Core就是发现、建立和维护每个Bean之间的关系所需的一系列工具,就是我们经常说的Util。

 

 

Spring Beans(演员)

Bean 组件在 Spring 的 org.springframework.beans 包下。

这个包下的所有类主要解决了三件事:Bean 的定义、Bean 的创建以及对 Bean 的解析。

对 Spring 的使用者来说唯一需要关心的就是 Bean 的创建,其他两个由 Spring 在内部帮你完成了,对你来说是透明的。

bean定义

 

bean解析

Bean创建

SpringBean的创建时典型的工厂模式,其工厂的继承层次关系如图所示,BeanFactory为顶级接口。

在工厂模式中,在工厂的实现类中生成 Bean 返回给调用客户端,这就要求客户端提供生成自己所需类实例的工厂类,增加客户负担。Spring 结合控制反转和依赖注入为客户端提供所需的实例,简化了客户端的操作。从

BeanFactory的最终默认实现类是DefaultListableBeanFactory,他实现了所有的接口。

为什么要定义怎么多层次的接口呢?实际上,里面的每个接口都有他使用的场合,它主要是为了区分在Spring内部对象的传递和转化过程中,对对象的数据访问所做的限制。这些接口共同定义了Bean的集合、Bean之间的关系和Bean的行为。

BeanFactory接口

  1. BeanFactory是应用程序组件的中央仓库,保存了bean的定义及实例信息,是访问Bean的根接口。
  2. BeanFactory 在创建Bean时,会根据bean的scope属性值(Singleton(单例)、prototype(多例)),创建一个或多个实例。在Web环境下,scope的值还有request、session等值,表示bean的有效期。
  3. BeanFactory可以从任意位置(xml文件、properties文件、java代码)加载Bean的定义信息。

 

ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这四个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为。

 

具体的实现方式大致如下。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
        implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    /** Map of bean definition objects, keyed by bean name */
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>;
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition){     
        //...
    }
}

 

beanDefinitionMap 作为具体的 Bean 容器,Spring 创建的对象实例保存其中。客户端需要时,使用工厂的 getBean 方法去试图得到相应的实例,如果实例已存在,则返回该实例;如果实例不存在,则首先产生相应实例并通过 registerBeanDefinition 方法将其保存在 beanDefinitionMap 中(Lazy Initialization),然后返回该实例给客户端。

 

Spring Bean 工厂的继承关系

 

pring 中的相关代码包是 org.springframework.beans

 

 

beanDefinitionMap 并不直接保存实例本身,而是将实例封装在 BeanDefinition 对象后进行保存。BeanDefinition 包含了实例的所有信息,其简化版的定义如下。

 

 

Bean生命周期

Bean的生命周期

Bean的创建

Bean的创建生命周期如下(参见BeanFactory接口)。并不是所有的实现类都会实现这些接口,但需要按照该顺序实现。

  1. BeanNameAware#setBeanName:设置bean的名称
  2. BeanClassLoaderAware#setBeanClassLoader:设置bean的classloader
  3. BeanFactoryAware#setBeanFactory:设置Bean的BeanFactory
  4. EnvironmentAware#setEnvironment:设置环境,Environment保存了
  5. EmbeddedValueResolverAware#setEmbeddedValueResolver(StringValueResolver resolver):用于注入Spring内置定义的字符串解析器(StringValueResolver是一个接口,定义了String resolveStringValue(String strVal方法))。@Value注解就是基于字符串解析器实现。
    1. EmbeddedValueResolverAware接口参见https://docs.spring.io/spring/docs/5.1.8.RELEASE/javadoc-api/org/springframework/context/EmbeddedValueResolverAware.html
    2. EmbeddedValueResolverAware用法参见https://blog.csdn.net/qq_28410283/article/details/90742940。 
    3.  org.springframework.beans.factory.config.PropertyPlaceholderConfigurer内部就是基于
      https://www.cnblogs.com/happyflyingpig/p/11075641.html
  6. ResourceLoaderAware's setResourceLoader (only applicable when running in an application context):
  7. ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
  8. MessageSourceAware's setMessageSource (only applicable when running in an application context)
  9. ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
  10. ServletContextAware's setServletContext (only applicable when running in a web application context)
  11. postProcessBeforeInitialization methods of BeanPostProcessors
  12. InitializingBean's afterPropertiesSet
  13. a custom init-method definition
  14. postProcessAfterInitialization methods of BeanPostProcessors

Bean的销毁

On shutdown of a bean factory, the following lifecycle methods apply:

  1. postProcessBeforeDestruction methods of DestructionAwareBeanPostProcessors
  2. DisposableBean's destroy
  3. a custom destroy-method definition

 

Spring Bean Factory

 

  1.  

环境 Environment

 

Environment

Spring Context(舞台)

 

Spring Core(工具)

 

 

 

 

 

https://blog.csdn.net/weixin_40224981/article/details/89138734

https://blog.csdn.net/gutie_bartholomew/article/details/83005035

https://www.cnblogs.com/williamjie/p/9378646.html

https://blog.csdn.net/zlfprogram/article/details/75937935

https://baijiahao.baidu.com/s?id=1627793055199571550&wfr=spider&for=pc

 

https://blog.csdn.net/zlfprogram/article/details/75937935

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值