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 結合控制反轉和依賴注入為用戶端提供所需的執行個體,簡化了用戶端的操作。從
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn10QCpXU3FERNdXVFJVMVVkUzkFRNVTUE5EMVVUTDZkaNNTTw0ENFV0TxAjej1WV65EMRR1T4lkaZpXQUllaadkTzkVbNVTRE5EakR1TsJEROpXWU5EeVd1T5QzVaJXOHR2XjdlW3BXbMlXQE50dRdlWppVba1mRykleNRVT4l0RPlXS61kMJpXW3llMNNTTU1EeR1WWwE1VZpXUE10a5MkWsZVbaZHMyIma1MFZrx2VZlWN55keOdVY3lTeMZTTINGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
BeanFactory的最終預設實作類是DefaultListableBeanFactory,他實作了所有的接口。
為什麼要定義怎麼多層次的接口呢?實際上,裡面的每個接口都有他使用的場合,它主要是為了區分在Spring内部對象的傳遞和轉化過程中,對對象的資料通路所做的限制。這些接口共同定義了Bean的集合、Bean之間的關系和Bean的行為。
BeanFactory接口
- BeanFactory是應用程式元件的中央倉庫,儲存了bean的定義及執行個體資訊,是通路Bean的根接口。
- BeanFactory 在建立Bean時,會根據bean的scope屬性值(Singleton(單例)、prototype(多例)),建立一個或多個執行個體。在Web環境下,scope的值還有request、session等值,表示bean的有效期。
- 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接口)。并不是所有的實作類都會實作這些接口,但需要按照該順序實作。
- BeanNameAware#setBeanName:設定bean的名稱
- BeanClassLoaderAware#
setBeanClassLoader:設定bean的classloader
- BeanFactoryAware#
setBeanFactory:設定Bean的BeanFactory
- EnvironmentAware#
setEnvironment:設定環境,Environment儲存了
- EmbeddedValueResolverAware#
setEmbeddedValueResolver(StringValueResolver resolver):用于注入Spring内置定義的字元串解析器(StringValueResolver是一個接口,定義了String resolveStringValue(String strVal方法))。@Value注解就是基于字元串解析器實作。
-
https://docs.spring.io/spring/docs/5.1.8.RELEASE/javadoc-api/org/springframework/context/EmbeddedValueResolverAware.html。EmbeddedValueResolverAware接口參見
- EmbeddedValueResolverAware用法
https://blog.csdn.net/qq_28410283/article/details/90742940。參見
-
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer内部就是基于
https://www.cnblogs.com/happyflyingpig/p/11075641.html
-
- ResourceLoaderAware's
(only applicable when running in an application context):setResourceLoader
- ApplicationEventPublisherAware's
(only applicable when running in an application context)setApplicationEventPublisher
- MessageSourceAware's
(only applicable when running in an application context)setMessageSource
- ApplicationContextAware's
(only applicable when running in an application context)setApplicationContext
- ServletContextAware's
(only applicable when running in a web application context)setServletContext
-
methods of BeanPostProcessorspostProcessBeforeInitialization
- InitializingBean's
afterPropertiesSet
- a custom init-method definition
-
methods of BeanPostProcessorspostProcessAfterInitialization
Bean的銷毀
On shutdown of a bean factory, the following lifecycle methods apply:
-
methods of DestructionAwareBeanPostProcessorspostProcessBeforeDestruction
- DisposableBean's
destroy
- a custom destroy-method definition
Spring Bean Factory
環境 Environment
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