日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

spring源码分析第二天------spring系统概述以及IOC实现原理

發(fā)布時(shí)間:2025/3/12 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring源码分析第二天------spring系统概述以及IOC实现原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、Spring5 概述

Spring 是一個(gè)開源的輕量級(jí) Java SE(Java 標(biāo)準(zhǔn)版本)/Java EE(Java 企業(yè)版本)開發(fā)應(yīng)用框架, 其目的是用于簡(jiǎn)化企業(yè)級(jí)應(yīng)用程序開發(fā)。
Spring 框架除了幫我們管理對(duì)象及其依賴關(guān)系,還提供像通用日志記錄、性能統(tǒng)計(jì)、安全控制、異常 處理等面向切面的能力,還能幫我管理最頭疼的數(shù)據(jù)庫(kù)事務(wù),本身提供了一套簡(jiǎn)單的 JDBC 訪問(wèn)實(shí)現(xiàn), 提供與第三方數(shù)據(jù)訪問(wèn)框架集成(如 Hibernate、JPA),與各種 Java EE 技術(shù)整合(如 Java Mail、 任務(wù)調(diào)度等等),提供一套自己的 web 層框架 Spring MVC、而且還能非常簡(jiǎn)單的與第三方 Web 框架集 成。

1.1、Spring 設(shè)計(jì)的初衷

Spring 是為解決企業(yè)級(jí)應(yīng)用開發(fā)的復(fù)雜性而設(shè)計(jì),一個(gè)最根本的使命:簡(jiǎn)化開發(fā)。
而 Spring 則立志于全方面的簡(jiǎn)化 Java 開發(fā)。對(duì)此,她主要采取了 4 個(gè)關(guān)鍵策略:
1,基于 POJO 的輕量級(jí)和最小侵入性編程;
2,通過(guò)依賴注入和面向接口松耦合;
3,基于切面和慣性進(jìn)行聲明式編程;
4,通過(guò)切面和模板減少樣板式代碼;
而他主要是通過(guò):面向 Bean、依賴注入以及面向切面這三種方式來(lái)達(dá)成的。

1.2、IOC與IOC

Spring 提供了 IOC 容器通過(guò)配置文件或者注解的方式來(lái)管理對(duì)象之間的依賴關(guān)系。
Spring 設(shè)計(jì)的核心 org.springframework.beans 包(架構(gòu)核心是 org.springframework.core 包),這個(gè)包通常不是由用戶直接使用,而是由服務(wù)器將 其用作其他多數(shù)功能的底層中介。下一個(gè)最高級(jí)抽象是 BeanFactory 接口,它是工廠設(shè)計(jì)模式的實(shí)現(xiàn), 允許通過(guò)名稱創(chuàng)建和檢索對(duì)象。BeanFactory 也可以管理對(duì)象之間的關(guān)系。

BeanFactory 支持兩個(gè)對(duì)象模型。

1,單例:模型提供了具有特定名稱的對(duì)象的共享實(shí)例,可以在查詢時(shí)對(duì)其進(jìn)行檢索。Singleton 是 默認(rèn)的也是最常用的對(duì)象模型。對(duì)于無(wú)狀態(tài)服務(wù)對(duì)象很理想。
2,原型:模型確保每次檢索都會(huì)創(chuàng)建單獨(dú)的對(duì)象。在每個(gè)用戶都需要自己的對(duì)象時(shí),原型模型最適 合

1.3、AOP 編程理念

面向切面編程,即 AOP,是一種編程思想,它允許程序員對(duì)橫切關(guān)注點(diǎn)或橫切典型的職責(zé)分界線的 行為(例如日志和事務(wù)管理)進(jìn)行模塊化。AOP 的核心構(gòu)造是方面(切面),它將那些影響多個(gè)類的行 為封裝到可重用的模塊中。

AOP 編程的常用場(chǎng)景有:Authentication 權(quán)限認(rèn)證、Logging 日志、Transctions Manager 事務(wù)、 Lazy Loading 懶加載、Context Process 上下文處理、Error Handler 錯(cuò)誤跟蹤(異常捕獲機(jī)制) 、Cache 緩存。

1.4 Spring5 系統(tǒng)架構(gòu)


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

spring-beans 和 spring-core 模塊是 Spring 框架的核心模塊,包含了控制反轉(zhuǎn)(Inversion of Control, IOC)和依賴注入(Dependency Injection, DI)。BeanFactory 接口是 Spring 框架中 的核心接口,它是工廠模式的具體實(shí)現(xiàn)。BeanFactory 使用控制反轉(zhuǎn)對(duì)應(yīng)用程序的配置和依賴性規(guī)范與 實(shí)際的應(yīng)用程序代碼進(jìn)行了分離。但 BeanFactory 容器實(shí)例化后并不會(huì)自動(dòng)實(shí)例化 Bean,只有當(dāng) Bean 被使用時(shí) BeanFactory 容器才會(huì)對(duì)該 Bean 進(jìn)行實(shí)例化與依賴關(guān)系的裝配。

spring-context 模塊構(gòu)架于核心模塊之上,他擴(kuò)展了 BeanFactory,為她添加了 Bean 生命周期 控制、框架事件體系以及資源加載透明化等功能。此外該模塊還提供了許多企業(yè)級(jí)支持,如郵件訪問(wèn)、 遠(yuǎn)程訪問(wèn)、任務(wù)調(diào)度等,ApplicationContext 是該模塊的核心接口,她是 BeanFactory 的超類,與 BeanFactory 不同,ApplicationContext 容器實(shí)例化后會(huì)自動(dòng)對(duì)所有的單實(shí)例 Bean 進(jìn)行實(shí)例化與 依賴關(guān)系的裝配,使之處于待用狀態(tài)。

b、AOP 和設(shè)備支持:
由 spring-aop、spring-aspects 和 spring-instrument 3 個(gè)模塊組成

在 Spring 中,他是以 JVM 的動(dòng)態(tài)代 理技術(shù)為基礎(chǔ),然后設(shè)計(jì)出了一系列的 AOP 橫切實(shí)現(xiàn),比如前置通知、返回通知、異常通知等,同時(shí), Pointcut 接口來(lái)匹配切入點(diǎn),可以使用現(xiàn)有的切入點(diǎn)來(lái)設(shè)計(jì)橫切面,也可以擴(kuò)展相關(guān)方法根據(jù)需求進(jìn) 行切入。
spring-aspects 模塊集成自 AspectJ 框架,主要是為 Spring AOP 提供多種 AOP 實(shí)現(xiàn)方法。

c、數(shù)據(jù)訪問(wèn)及集成:
由 spring-jdbc、spring-tx、spring-orm、spring-jms 和 spring-oxm 5 個(gè) 模塊組成

spring-jdbc 模塊是 Spring 提供的 JDBC 抽象框架的主要實(shí)現(xiàn)模塊,用于簡(jiǎn)化 Spring JDBC。主 要是提供 JDBC 模板方式、關(guān)系數(shù)據(jù)庫(kù)對(duì)象化方式、SimpleJdbc 方式、事務(wù)管理來(lái)簡(jiǎn)化 JDBC 編程;

spring-tx 模塊是 Spring JDBC 事務(wù)控制實(shí)現(xiàn)模塊。

spring-orm 模塊是 ORM 框架支持模塊,主要集成 Hibernate, Java Persistence API (JPA) 和 Java Data Objects (JDO) 用于資源管理、數(shù)據(jù)訪問(wèn)對(duì)象(DAO)的實(shí)現(xiàn)和事務(wù)策略。

spring-jms 模塊(Java Messaging Service)能夠發(fā)送和接受信息

d.Web:
由 spring-web、spring-webmvc、spring-websocket 和 spring-webflux 4 個(gè)模塊組 成。
spring-web 模塊為 Spring 提供了最基礎(chǔ) Web 支持,主要建立于核心容器之上,通過(guò) Servlet 或 者 Listeners 來(lái)初始化 IOC 容器,也包含一些與 Web 相關(guān)的支持。
spring-webmvc 模 塊 眾 所 周 知 是 一 個(gè) 的 Web-Servlet 模 塊 , 實(shí) 現(xiàn) 了 Spring MVC (model-view-Controller)的 Web 應(yīng)用。 spring-websocket 模塊主要是與 Web 前端的全雙工通訊的協(xié)議。

e、報(bào)文發(fā)送:
即 spring-messaging 模塊。
spring-messaging 是從 Spring4 開始新加入的一個(gè)模塊,主要職責(zé)是為 Spring 框架集成一些基 礎(chǔ)的報(bào)文傳送應(yīng)用。

f.Test:
即 spring-test 模塊。
spring-test 模塊主要為測(cè)試提供支持的

1.5、模塊的依賴關(guān)系

2、spring5源碼分析

2.1、什么是 IOC/DI?

IOC(Inversion of Control)控制反轉(zhuǎn):所謂控制反轉(zhuǎn),就是把原先我們代碼里面需要實(shí)現(xiàn)的對(duì)象創(chuàng) 建、依賴的代碼,反轉(zhuǎn)給容器來(lái)幫忙實(shí)現(xiàn)。那么必然的我們需要?jiǎng)?chuàng)建一個(gè)容器,同時(shí)需要一種描述來(lái)讓 容器知道需要?jiǎng)?chuàng)建的對(duì)象與對(duì)象的關(guān)系。這個(gè)描述最具體表現(xiàn)就是我們可配置的文件。
DI(Dependency Injection)依賴注入:就是指對(duì)象是被動(dòng)接受依賴類而不是自己主動(dòng)去找,換句話說(shuō) 就是指對(duì)象不是從容器中查找它依賴的類,而是在容器實(shí)例化對(duì)象的時(shí)候主動(dòng)將它依賴的類注入給它。 先從我們自己設(shè)計(jì)這樣一個(gè)視角來(lái)考慮: 對(duì)象和對(duì)象關(guān)系怎么表示? 可以用 xml,properties 文件等語(yǔ)義化配置文件表示。

**2.2、Spring 核心容器體系結(jié)構(gòu)

a、BeanFactory

Spring Bean 的創(chuàng)建是典型的工廠模式,這一系列的 Bean 工廠,也即 IOC 容器為開發(fā)者管理對(duì)象 間的依賴關(guān)系提供了很多便利和基礎(chǔ)服務(wù),在 Spring 中有許多的 IOC 容器的實(shí)現(xiàn)供用戶選擇和使用, 其相互關(guān)系如下:

其中 BeanFactory 作為最頂層的一個(gè)接口類,它定義了 IOC 容器的基本功能規(guī)范,BeanFactory 有三 個(gè)子類:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。 但是從上圖中我們可以發(fā)現(xiàn)最終的默認(rèn)實(shí)現(xiàn)類是 DefaultListableBeanFactory,他實(shí)現(xiàn)了所有的接 口。那為何要定義這么多層次的接口呢?查閱這些接口的源碼和說(shuō)明發(fā)現(xiàn),每個(gè)接口都有他使用的場(chǎng)合, 它主要是為了區(qū)分在 Spring 內(nèi)部在操作過(guò)程中對(duì)象的傳遞和轉(zhuǎn)化過(guò)程中,對(duì)對(duì)象的數(shù)據(jù)訪問(wèn)所做的限 制。例如 ListableBeanFactory 接口表示這些 Bean 是可列表的,而 HierarchicalBeanFactory 表 示的是這些 Bean 是有繼承關(guān)系的,也就是每個(gè) Bean 有可能有父 Bean。AutowireCapableBeanFactory接口定義 Bean 的自動(dòng)裝配規(guī)則。

在 BeanFactory 里只對(duì) IOC 容器的基本行為作了定義,根本不關(guān)心你的 Bean 是如何定義怎樣加載的。 正如我們只關(guān)心工廠里得到什么的產(chǎn)品對(duì)象,至于工廠是怎么生產(chǎn)這些對(duì)象的,這個(gè)基本的接口不關(guān)心。 而要知道工廠是如何產(chǎn)生對(duì)象的,我們需要看具體的 IOC 容器實(shí)現(xiàn),Spring 提供了許多 IOC 容器的實(shí)現(xiàn)。比如 XmlBeanFactory,ClasspathXmlApplicationContext 等。其中 XmlBeanFactory 就 是針對(duì)最基本的 IOC 容器的實(shí)現(xiàn),這個(gè) IOC 容器可以讀取 XML 文件定義的 BeanDefinition(XML 文件中對(duì) bean 的描述),如果說(shuō) XmlBeanFactory 是容器中的屌絲,ApplicationContext 應(yīng)該算容器中 的高帥富.

ApplicationContext 是 Spring 提供的一個(gè)高級(jí)的 IOC 容器,它除了能夠提供 IOC 容器的基本功 能外,還為用戶提供了以下的附加服務(wù)。 從 ApplicationContext 接口的實(shí)現(xiàn),我們看出其特點(diǎn):
1.支持信息源,可以實(shí)現(xiàn)國(guó)際化。(實(shí)現(xiàn) MessageSource 接口)
2.訪問(wèn)資源。(實(shí)現(xiàn) ResourcePatternResolver 接口,后面章節(jié)會(huì)講到)
3.支持應(yīng)用事件。(實(shí)現(xiàn) ApplicationEventPublisher 接口)

b、BeanDefinition

SpringIOC 容器管理了我們定義的各種 Bean 對(duì)象及其相互的關(guān)系,Bean 對(duì)象在 Spring 實(shí)現(xiàn)中是 以 BeanDefinition 來(lái)描述的,其繼承體系如下:

Bean 的解析過(guò)程非常復(fù)雜,功能被分的很細(xì),因?yàn)檫@里需要被擴(kuò)展的地方很多,必須保證有足夠的靈 活性,以應(yīng)對(duì)可能的變化。Bean 的解析主要就是對(duì) Spring 配置文件的解析。這個(gè)解析過(guò)程主要通過(guò)下 圖中的類完成:

c、IOC 容器的初始化

IOC 容器的初始化包括 BeanDefinition 的 Resource 定位、載入和注冊(cè)這三個(gè)基本的過(guò)程。

詳細(xì)可以從我的GitHub下載源碼進(jìn)行學(xué)習(xí),對(duì)關(guān)鍵步驟我都有進(jìn)行注釋。如果對(duì)您有幫助,麻煩三連,您的支持,是我進(jìn)行原創(chuàng)最大的動(dòng)力!

總結(jié)

以上是生活随笔為你收集整理的spring源码分析第二天------spring系统概述以及IOC实现原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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