spring核心功能结构
spring核心功能結構
Spring大約有20個模塊,由1300多個不同的文件構成。這些模塊可以分為:
核心容器、AOP和設備支持、數據訪問與集成、Web組件、通信報文和集成測試等,
下面是 Spring 框架的總體架構圖:
核心容器由 beans、core、context 和 expression(Spring Expression Language,SpEL)4個模塊組成。
- spring-beans和spring-core模塊是Spring框架的核心模塊,包含了控制反轉(Inversion of Control,IOC)和依賴注入(Dependency Injection,DI)。BeanFactory使用控制反轉對應用程序的配置和依賴性規范與實際的應用程序代碼進行了分離。BeanFactory屬于延時加載,也就是說在實例化容器對象后并不會自動實例化Bean,只有當Bean被使用時,BeanFactory才會對該 Bean 進行實例化與依賴關系的裝配。
- spring-context模塊構架于核心模塊之上,擴展了BeanFactory,為它添加了Bean生命周期控制、框架事件體系及資源加載透明化等功能。此外,該模塊還提供了許多企業級支持,如郵件訪問、遠程訪問、任務調度等,ApplicationContext 是該模塊的核心接口,它的超類是 BeanFactory。與BeanFactory不同,ApplicationContext實例化后會自動對所有的單實例Bean進行實例化與依賴關系的裝配,使之處于待用狀態。
- spring-context-support模塊是對Spring IoC容器及IoC子容器的擴展支持。
- spring-context-indexer模塊是Spring的類管理組件和Classpath掃描組件。
- spring-expression 模塊是統一表達式語言(EL)的擴展模塊,可以查詢、管理運行中的對象,同時也可以方便地調用對象方法,以及操作數組、集合等。它的語法類似于傳統EL,但提供了額外的功能,最出色的要數函數調用和簡單字符串的模板函數。EL的特性是基于Spring產品的需求而設計的,可以非常方便地同Spring IoC進行交互。
bean概述
Spring 就是面向?Bean?的編程(BOP,Bean Oriented Programming),
Bean 在 Spring 中處于核心地位。
Bean對于Spring的意義就像Object對于OOP的意義一樣,Spring中沒有Bean也就沒有Spring存在的意義。
Spring IoC容器通過配置文件或者注解的方式來管理bean對象之間的依賴關系。
spring中bean用于對一個類進行封裝。如下面的配置:
為什么Bean如此重要呢?
- spring 將bean對象交由一個叫IOC容器進行管理。
- bean對象之間的依賴關系在配置文件中體現,并由spring完成。
Spring IOC相關接口分析
BeanFactory解析
Spring中Bean的創建是典型的工廠模式,這一系列的Bean工廠,即IoC容器,
為開發者管理對象之間的依賴關系提供了很多便利和基礎服務,在Spring中有許多IoC容器的實現供用戶選擇,
其相互關系如下圖所示。
其中,BeanFactory作為最頂層的一個接口,定義了IoC容器的基本功能規范,
BeanFactory有三個重要的子接口:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。
但是從類圖中我們可以發現最終的默認實現類是DefaultListableBeanFactory,它實現了所有的接口。
那么為何要定義這么多層次的接口呢?
每個接口都有它的使用場合,主要是為了區分在Spring內部操作過程中對象的傳遞和轉化,對對象的數據訪問所做的限制。例如,
- ListableBeanFactory接口表示這些Bean可列表化。
- HierarchicalBeanFactory表示這些Bean 是有繼承關系的,也就是每個 Bean 可能有父 Bean
- AutowireCapableBeanFactory 接口定義Bean的自動裝配規則。
這三個接口共同定義了Bean的集合、Bean之間的關系及Bean行為。最基本的IoC容器接口是BeanFactory,來看一下它的源碼:
public interface BeanFactory { ?String FACTORY_BEAN_PREFIX = "&"; ?//根據bean的名稱獲取IOC容器中的的bean對象Object getBean(String name) throws BeansException;//根據bean的名稱獲取IOC容器中的的bean對象,并指定獲取到的bean對象的類型,這樣我們使用時就不需要進行類型強轉了<T> T getBean(String name, Class<T> requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;<T> T getBean(Class<T> requiredType) throws BeansException;<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); ?//判斷容器中是否包含指定名稱的bean對象boolean containsBean(String name);//根據bean的名稱判斷是否是單例boolean isSingleton(String name) throws NoSuchBeanDefinitionException;boolean isPrototype(String name) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;@NullableClass<?> getType(String name) throws NoSuchBeanDefinitionException;String[] getAliases(String name); }在BeanFactory里只對IoC容器的基本行為做了定義,根本不關心你的Bean是如何定義及怎樣加載的。
正如我們只關心能從工廠里得到什么產品,不關心工廠是怎么生產這些產品的。
BeanFactory有一個很重要的子接口,
就是ApplicationContext接口,該接口主要來規范容器中的bean對象是非延時加載,
即在創建容器對象的時候就對象bean進行初始化,并存儲到一個容器中。
要知道工廠是如何產生對象的,我們需要看具體的IoC容器實現,Spring提供了許多IoC容器實現,比如:
-
ClasspathXmlApplicationContext : 根據類路徑加載xml配置文件,并創建IOC容器對象。
-
FileSystemXmlApplicationContext :根據系統路徑加載xml配置文件,并創建IOC容器對象。
-
AnnotationConfigApplicationContext :加載注解類配置,并創建IOC容器。
BeanDefinition解析
Spring IoC容器管理我們定義的各種Bean對象及其相互關系,而Bean對象在Spring實現中是以BeanDefinition來描述的,如下面配置文件
其繼承體系如下圖所示:
?BeanDefinitionReader解析
Bean的解析過程非常復雜,功能被分得很細,因為這里需要被擴展的地方很多,必須保證足夠的靈活性,以應對可能的變化。
Bean的解析主要就是對Spring配置文件的解析。
這個解析過程主要通過BeanDefinitionReader來完成,看看Spring中BeanDefinitionReader的類結構圖,如下圖所示
看看BeanDefinitionReader接口定義的功能來理解它具體的作用:
public interface BeanDefinitionReader { ?//獲取BeanDefinitionRegistry注冊器對象BeanDefinitionRegistry getRegistry(); ?@NullableResourceLoader getResourceLoader(); ?@NullableClassLoader getBeanClassLoader(); ?BeanNameGenerator getBeanNameGenerator(); ?/*下面的loadBeanDefinitions都是加載bean定義,從指定的資源中*/int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException;int loadBeanDefinitions(String location) throws BeanDefinitionStoreException;int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException; }BeanDefinitionRegistry解析
BeanDefinitionReader用來解析bean定義,并封裝BeanDefinition對象,
而我們定義的配置文件中定義了很多bean標簽,所以就有一個問題,解析的BeanDefinition對象存儲到哪兒?
答案就是BeanDefinition的注冊中心,而該注冊中心頂層接口就是BeanDefinitionRegistry。
public interface BeanDefinitionRegistry extends AliasRegistry { ?//往注冊表中注冊beanvoid registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException; ?//從注冊表中刪除指定名稱的beanvoid removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; ?//獲取注冊表中指定名稱的beanBeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;//判斷注冊表中是否已經注冊了指定名稱的beanboolean containsBeanDefinition(String beanName);//獲取注冊表中所有的bean的名稱String[] getBeanDefinitionNames();int getBeanDefinitionCount();boolean isBeanNameInUse(String beanName); }繼承結構圖如下:
從上面類圖可以看到BeanDefinitionRegistry接口的子實現類主要有以下幾個:
-
DefaultListableBeanFactory
在該類中定義了如下代碼,就是用來注冊bean
創建容器
ClassPathXmlApplicationContext對Bean配置資源的載入是從refresh()方法開始的。
refresh()方法是一個模板方法,規定了 IoC 容器的啟動流程,有些邏輯要交給其子類實現。
它對 Bean 配置資源進行載入,ClassPathXmlApplicationContext通過調用其父類AbstractApplicationContext的refresh()方法啟動整個IoC容器對Bean定義的載入過程。
總結
以上是生活随笔為你收集整理的spring核心功能结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring使用回顾
- 下一篇: eureka的自我保护