天天看點

Spring的體系結構、核心特性

spring的優點

spring的體系結構

spring webflux

spring的2大特性 | 核心

IoC 控制反轉

Spring容器的核心接口

AOP 面向切面程式設計

aop中的主要名詞

aop的織入時機 | 方式

spring提供的2種aop實作

spring容器的啟動 | 初始化過程

非侵入式設計,降低代碼耦合程度

支援AOP

強大的整合能力,可以和很多優秀架構無縫整合

Spring的體系結構、核心特性

Spring是Java應用 full-stack 式的輕量級開源架構,以 IoC(Inverse Of Control,控制反轉)和 AOP(Aspect Oriented Programming,面向切面程式設計)為核心,并提供了Data Access資料通路子產品來操作資料源,提供了Web子產品來支援web開發。

spring的5大版塊|功能

Test 測試子產品:提供對測試的支援

Core Container 核心容器子產品:實作spring容器,主要提供IoC/DI功能

AOP子產品:提供對面向切面程式設計(AOP)的支援

Data Access/Integration 資料通路/內建子產品:提供對資料源操作的支援,包括對jdbc、orm映射架構、xml解析、消息隊列、事務管理的支援。

Web子產品:提供對web應用的支援

Core Container子產品分為4個小子產品

Beans:提供BeanFactory,用于建立bean

Core:提供IoC/DI功能

Context:此子產品建立在Beans、Core子產品的基礎上,用來通路對象的定義、配置(上下文),以及整合其它架構時提供對第三方庫的支援

SpEL:提供對Spring EL(表達式語言)的支援

AOP子產品提供了2種實作AOP的方式

spring aop:早期版本中提供的

aspectj:在後續版本中內建的

在目前最新的5.x版本中,Web子產品已經廢棄了 Portlet 元件,同時增加了用于異步響應式處理的 WebFlux 元件。

spring web應用可以基于spring mvc,也可以基于spring webflux,對應的技術棧如下

Spring的體系結構、核心特性

spring mvc:基于serlvet,servlet從3.1開始也提供了非阻塞的api,但犧牲了其它特點,使用servlet時一般都是使用阻塞的api,一個線程處理一個請求

spring webflux:spring5.x版本推出的,基于reactive,非阻塞、支援異步,一個線程可以同時處理多個請求,用少量的線程就可以處理大量的請求。spring webflux處理請求的速度不一定比spring webmvc快,但極大地提高了系統的吞吐量,适合在機器性能不足的情況下用來提高吞吐量。缺點是使用函數式程式設計,調試難度比spring webmvc大。

以springboot應用為例

IoC(控制反轉)是一種程式設計思想,将原本在程式中手動建立對象的控制權,交給IoC容器,由容器統一管理對象間的依賴關系,負責建立對象、完成依賴的注入。

IoC把開發者從複雜的依賴關系中解放出來,無需關心對象的建立過程,大大簡化了應用的開發、降低了開發難度,增加了項目的可維護性。

IoC隻是一種程式設計思想,所有實作了IoC的容器都叫做IoC容器,Spring容器隻是IoC的其中一種實作,Spring容器 ≠ IoC容器,隻是IoC容器中的一種。

IoC容器的優點

避免在各處使用new來建立執行個體,降低類之間的耦合度,易于維護

由容器自動建立類的執行個體、注入所需依賴,開發者無需關心對象建立的細節、對象間複雜的依賴關系

IoC常見的實作方式

DI:依賴注入,IoC容器主動給bean注入所需的依賴

DL:依賴查找,bean主動到IoC容器中尋找所需的依賴

DL是EJB時代的方式,現在的主流方式是DI

Spring容器提供的功能

依賴檢查、依賴注入

自動裝配

可以設定bean的初始化方法、銷毀方法、回調方法

1、BeanFactory

BeanFactory是spring最核心的接口,顧名思義是生産 bean 的工廠,負責生産和管理各個 bean 執行個體,用于建立bean之間的依賴關系、提供IoC的配置機制、管理bean的生命周期。

2、ApplicationContext 應用上下文

ApplicationContext繼承了多個接口,提供了處理bean的能力,比如繼承了ResourcePatternResolver接口,可以加載解析資源檔案;繼承了ApplicationEventPublisher接口,可以監聽、釋出事件;繼承了多種類型的BeanFactory,可以管理、裝配bean。間接繼承了 BeanFactory 接口。

Spring的體系結構、核心特性

這2個接口都有衆多的子接口、實作類。

二者的差別:BeanFactory提供spring架構的基礎功能,主要在spring架構内部使用,面向spring架構本身;ApplicationContext在BeanFactory的基礎上封裝了更多的基礎功能,主要提供給spring的使用者調用,面向spring的使用者。

aop: Aspect-Oriented Programming 面向切面程式設計,是面向對象程式設計的一種補充,把和業務邏輯無關的系統服務級的橫切邏輯剝離出來,不與業務代碼耦合在一起,減少系統中的重複代碼,使系統變得高内聚、低耦合,更易維護,常見的應用比如日志記錄、事務管理、安全檢查、緩存更新等。

aspect 切面:橫切邏輯的代碼實作

target 目标:應用切面的業務對象

join point 連接配接點:目标類|對象中的所有方法都可以作為連接配接點

point cut 切入點:目标類|對象中實際應用切面 | 切面的方法

weaving 織入:把切面應用到目标對象的連接配接點以實作增強的過程

編譯時織入:通過修改編譯生成的位元組碼實作,需要借助專門的編譯器,缺點是編譯就已确定要增強的對象、要應用的增強,不夠靈活

編譯後織入:生成位元組碼之後、類加載之前,使用工具對位元組碼進行處理以應用增強

類加載時織入:使用自定義的類加載器,在類加載時應用增強

運作時織入:在運作時通過動态代理生成代理,使用代理代替目标對象進行操作

1、spring aop

spring早期提供的aop實作方式,隻提供簡單的aop實作,隻能對spring容器中的bean應用增強,隻能對方法進行增強。

基于動态代理實作,在運作時進行織入,可以指定要使用的動态代理類型,未指定時預設使用jdk動态代理,如果不能使用jdk動态代理生成代理對象(不滿足jdk動态代理的使用要求),則使用cglib代理。

2、aspectj

aspectj是一個專業的aop架構,提供完整的aop解決方案,在spring後續版本中進行了內建。aspectj比spring aop更加強大,可對所有域對象上實作增強(可以對spring容器之内、之外的對象進行增強),可對字段、方法、構造方法等内容進行增強,

aspectj支援在編譯時、編譯後、類加載時進行織入,通常是在編譯時進行織入,基于位元組碼操作,使用的是靜态代理,需要借助AspectJ 編譯器 (ajc) 。

性能方面:aspectj在編譯時就以确定增強,使用時直接生成代理;spring aop是在運作時動态生成代理,性能比aspectj差,在大量使用aop的項目中性能差距比較明顯,更推薦使用aspectj。

Spring的體系結構、核心特性
Spring的體系結構、核心特性

Spring容器實際是一個Map,Map中存放各種對象。

讀取配置檔案生成對應的Resource對象

将Resource對象解析為BeanDefinition對象

根據BeanDefinition對象生成對應的Bean,注冊到IoC容器中