天天看點

Spring核心元件Spring三個核心元件之間的關系Spring Beans(演員)Spring Core(工具)

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 結合控制反轉和依賴注入為用戶端提供所需的執行個體,簡化了用戶端的操作。從

Spring核心元件Spring三個核心元件之間的關系Spring Beans(演員)Spring Core(工具)

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 {

    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

環境 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

繼續閱讀