spring的優點
spring的體系結構
spring webflux
spring的2大特性 | 核心
IoC 控制反轉
Spring容器的核心接口
AOP 面向切面程式設計
aop中的主要名詞
aop的織入時機 | 方式
spring提供的2種aop實作
spring容器的啟動 | 初始化過程
非侵入式設計,降低代碼耦合程度
支援AOP
強大的整合能力,可以和很多優秀架構無縫整合

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 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 接口。
這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容器實際是一個Map,Map中存放各種對象。
讀取配置檔案生成對應的Resource對象
将Resource對象解析為BeanDefinition對象
根據BeanDefinition對象生成對應的Bean,注冊到IoC容器中