日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring核心功能结构

發(fā)布時間:2025/4/16 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring核心功能结构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

spring核心功能結(jié)構(gòu)

Spring大約有20個模塊,由1300多個不同的文件構(gòu)成。這些模塊可以分為:

核心容器、AOP和設(shè)備支持、數(shù)據(jù)訪問與集成、Web組件、通信報文和集成測試等,

下面是 Spring 框架的總體架構(gòu)圖:

核心容器由 beans、core、context 和 expression(Spring Expression Language,SpEL)4個模塊組成。

  • spring-beans和spring-core模塊是Spring框架的核心模塊,包含了控制反轉(zhuǎn)(Inversion of Control,IOC)和依賴注入(Dependency Injection,DI)。BeanFactory使用控制反轉(zhuǎn)對應(yīng)用程序的配置和依賴性規(guī)范與實際的應(yīng)用程序代碼進行了分離。BeanFactory屬于延時加載,也就是說在實例化容器對象后并不會自動實例化Bean,只有當(dāng)Bean被使用時,BeanFactory才會對該 Bean 進行實例化與依賴關(guān)系的裝配。
  • spring-context模塊構(gòu)架于核心模塊之上,擴展了BeanFactory,為它添加了Bean生命周期控制、框架事件體系及資源加載透明化等功能。此外,該模塊還提供了許多企業(yè)級支持,如郵件訪問、遠(yuǎn)程訪問、任務(wù)調(diào)度等,ApplicationContext 是該模塊的核心接口,它的超類是 BeanFactory。與BeanFactory不同,ApplicationContext實例化后會自動對所有的單實例Bean進行實例化與依賴關(guān)系的裝配,使之處于待用狀態(tài)。
  • spring-context-support模塊是對Spring IoC容器及IoC子容器的擴展支持。
  • spring-context-indexer模塊是Spring的類管理組件和Classpath掃描組件。
  • spring-expression 模塊是統(tǒng)一表達(dá)式語言(EL)的擴展模塊,可以查詢、管理運行中的對象,同時也可以方便地調(diào)用對象方法,以及操作數(shù)組、集合等。它的語法類似于傳統(tǒng)EL,但提供了額外的功能,最出色的要數(shù)函數(shù)調(diào)用和簡單字符串的模板函數(shù)。EL的特性是基于Spring產(chǎn)品的需求而設(shè)計的,可以非常方便地同Spring IoC進行交互。


bean概述

Spring 就是面向?Bean?的編程(BOP,Bean Oriented Programming),

Bean 在 Spring 中處于核心地位。

Bean對于Spring的意義就像Object對于OOP的意義一樣,Spring中沒有Bean也就沒有Spring存在的意義。

Spring IoC容器通過配置文件或者注解的方式來管理bean對象之間的依賴關(guān)系。

spring中bean用于對一個類進行封裝。如下面的配置:

為什么Bean如此重要呢?

  • spring 將bean對象交由一個叫IOC容器進行管理。
  • bean對象之間的依賴關(guān)系在配置文件中體現(xiàn),并由spring完成。


Spring IOC相關(guān)接口分析

BeanFactory解析

Spring中Bean的創(chuàng)建是典型的工廠模式,這一系列的Bean工廠,即IoC容器,

為開發(fā)者管理對象之間的依賴關(guān)系提供了很多便利和基礎(chǔ)服務(wù),在Spring中有許多IoC容器的實現(xiàn)供用戶選擇,

其相互關(guān)系如下圖所示。

其中,BeanFactory作為最頂層的一個接口,定義了IoC容器的基本功能規(guī)范,

BeanFactory有三個重要的子接口:ListableBeanFactoryHierarchicalBeanFactoryAutowireCapableBeanFactory

但是從類圖中我們可以發(fā)現(xiàn)最終的默認(rèn)實現(xiàn)類是DefaultListableBeanFactory,它實現(xiàn)了所有的接口。

那么為何要定義這么多層次的接口呢?

每個接口都有它的使用場合,主要是為了區(qū)分在Spring內(nèi)部操作過程中對象的傳遞和轉(zhuǎn)化,對對象的數(shù)據(jù)訪問所做的限制。例如,

  • ListableBeanFactory接口表示這些Bean可列表化。
  • HierarchicalBeanFactory表示這些Bean 是有繼承關(guān)系的,也就是每個 Bean 可能有父 Bean
  • AutowireCapableBeanFactory 接口定義Bean的自動裝配規(guī)則。

這三個接口共同定義了Bean的集合、Bean之間的關(guān)系及Bean行為。最基本的IoC容器接口是BeanFactory,來看一下它的源碼:

public interface BeanFactory { ?String FACTORY_BEAN_PREFIX = "&"; ?//根據(jù)bean的名稱獲取IOC容器中的的bean對象Object getBean(String name) throws BeansException;//根據(jù)bean的名稱獲取IOC容器中的的bean對象,并指定獲取到的bean對象的類型,這樣我們使用時就不需要進行類型強轉(zhuǎn)了<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);//根據(jù)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容器的基本行為做了定義,根本不關(guān)心你的Bean是如何定義及怎樣加載的。

正如我們只關(guān)心能從工廠里得到什么產(chǎn)品,不關(guān)心工廠是怎么生產(chǎn)這些產(chǎn)品的。

BeanFactory有一個很重要的子接口,

就是ApplicationContext接口,該接口主要來規(guī)范容器中的bean對象是非延時加載,

即在創(chuàng)建容器對象的時候就對象bean進行初始化,并存儲到一個容器中。

要知道工廠是如何產(chǎn)生對象的,我們需要看具體的IoC容器實現(xiàn),Spring提供了許多IoC容器實現(xiàn),比如:

  • ClasspathXmlApplicationContext : 根據(jù)類路徑加載xml配置文件,并創(chuàng)建IOC容器對象。

  • FileSystemXmlApplicationContext :根據(jù)系統(tǒng)路徑加載xml配置文件,并創(chuàng)建IOC容器對象。

  • AnnotationConfigApplicationContext :加載注解類配置,并創(chuàng)建IOC容器。



BeanDefinition解析

Spring IoC容器管理我們定義的各種Bean對象及其相互關(guān)系,而Bean對象在Spring實現(xiàn)中是以BeanDefinition來描述的,如下面配置文件

其繼承體系如下圖所示:

?BeanDefinitionReader解析

Bean的解析過程非常復(fù)雜,功能被分得很細(xì),因為這里需要被擴展的地方很多,必須保證足夠的靈活性,以應(yīng)對可能的變化。

Bean的解析主要就是對Spring配置文件的解析。

這個解析過程主要通過BeanDefinitionReader來完成,看看Spring中BeanDefinitionReader的類結(jié)構(gòu)圖,如下圖所示

看看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標(biāo)簽,所以就有一個問題,解析的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;//判斷注冊表中是否已經(jīng)注冊了指定名稱的beanboolean containsBeanDefinition(String beanName);//獲取注冊表中所有的bean的名稱String[] getBeanDefinitionNames();int getBeanDefinitionCount();boolean isBeanNameInUse(String beanName); }

繼承結(jié)構(gòu)圖如下:

從上面類圖可以看到BeanDefinitionRegistry接口的子實現(xiàn)類主要有以下幾個:

  • DefaultListableBeanFactory

    在該類中定義了如下代碼,就是用來注冊bean

創(chuàng)建容器

ClassPathXmlApplicationContext對Bean配置資源的載入是從refresh()方法開始的。

refresh()方法是一個模板方法,規(guī)定了 IoC 容器的啟動流程,有些邏輯要交給其子類實現(xiàn)。

它對 Bean 配置資源進行載入,ClassPathXmlApplicationContext通過調(diào)用其父類AbstractApplicationContext的refresh()方法啟動整個IoC容器對Bean定義的載入過程。

總結(jié)

以上是生活随笔為你收集整理的spring核心功能结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。