Spring 依賴注入、AOP代理全方面解析
OCP
O代表Open ,C代表Closed
在軟件開發(fā)過程中應(yīng)當對擴展開放,對修改關(guān)閉。也就是說,如果在進行功能擴展的時候,添加額外的類是沒問題的,但因為功能擴展而修改之前運行正常的程序,這是忌諱的,不被允許的。因為一旦修改之前運行正常的程序,就會導致項目整體要進行全方位的重新測試。
DIP
依賴倒置原則(Dependence Inversion Principle),簡稱DIP,主要倡導面向抽象編程,面向接口編程,不要面向具體編程,
讓上層不再依賴下層,下面改動了,上面的代碼不會受到牽連。
怎么做到呢?當然是用接口。
這樣可以大大降低程序的耦合度,耦合度低了,擴展力就強了,同時代碼復用性也會增強。(軟件七大開發(fā)原則都是在為解耦合服務(wù))
控制反轉(zhuǎn)IoC(Invension of Control)
控制反轉(zhuǎn)是一種新型的設(shè)計模式
交出的權(quán)力
new對象的權(quán)力
對象之間的關(guān)系(到底用的是哪一個實現(xiàn)類)
Spring
是實現(xiàn)類IoC的容器。
IOC是思想,DI是實現(xiàn)。通過DI實現(xiàn)bean管理(有bean對象的創(chuàng)建和bean與bean之間關(guān)系的維護)。
DI(依賴注入)有set注入和構(gòu)造注入

依賴注入之set注入

這里最后一行的理解,先能找到是哪一個set方法,再找到形參對應(yīng)的實際參數(shù)到底在哪里。
外部 Bean
- 在 Spring 配置文件中單獨定義
- 可以被多個其他 Bean 引用
- 有自己獨立的 ID/名稱
<!-- 外部 Bean 定義 -->
<bean id="address" class="com.example.Address">
<property name="city" value="Beijing"/>
</bean>
<!-- 引用外部 Bean -->
<bean id="employee" class="com.example.Employee">
<property name="address" ref="address"/>
</bean>內(nèi)部 Bean
- 直接在引用它的 Bean 內(nèi)部定義
- 只能被當前 Bean 使用
- 沒有獨立的 ID/名稱
<bean id="employee" class="com.example.Employee">
<property name="address">
<!-- 內(nèi)部 Bean 定義 -->
<bean class="com.example.Address">
<property name="city" value="Beijing"/>
</bean>
</property>
</bean>作用范圍不同
| 特性 | 外部 Bean | 內(nèi)部 Bean |
|---|---|---|
| 作用域 | 全局可用 | 僅限當前 Bean 內(nèi)部使用 |
| 生命周期 | 由容器管理 | 隨外部 Bean 創(chuàng)建和銷毀 |
| 是否可重用 | 是,可被多個 Bean 引用 | 否,只能被當前 Bean 使用 |
構(gòu)造注入
set注入在創(chuàng)建對象之后,而構(gòu)造注入在創(chuàng)建對象的時候就注入了。
xml解析+工廠模式+反射機制
IoC思想的一種具體實現(xiàn)是依賴注入DI
八大框架

兩個核心模塊 IoC AOP
AOP
ORM(Object-Relational Mapping,對象關(guān)系映射) 是一種編程技術(shù),用于在 面向?qū)ο缶幊陶Z言(如 Java、Python)中的對象與 關(guān)系型數(shù)據(jù)庫(如 MySQL、PostgreSQL)的表之間建立映射關(guān)系,從而讓開發(fā)者能夠以操作對象的方式間接操作數(shù)據(jù)庫,無需直接編寫復雜的 SQL 語句。
Spring的非侵入體現(xiàn)在哪里
Spring框架的非侵入式(Non-Invasive)設(shè)計是其核心哲學之一,指的是它不會強制要求你的代碼必須依賴Spring特定的類或接口,而是允許你以原生方式編寫業(yè)務(wù)邏輯,僅在需要時通過配置或注解引入Spring的能力。以下是具體分析:
1. 什么是“非侵入式”?
傳統(tǒng)框架的侵入性:
例如早期的EJB 2.x,要求業(yè)務(wù)類必須繼承特定父類或?qū)崿F(xiàn)指定接口(如SessionBean),代碼與框架深度耦合。
// EJB 2.x的侵入式寫法(必須實現(xiàn)框架接口)
public class UserService implements SessionBean {
// 必須實現(xiàn)框架方法
public void ejbActivate() {}
// 業(yè)務(wù)邏輯...
}
Spring的非侵入性:
你的類可以是純POJO(Plain Old Java Object),無需繼承或?qū)崿F(xiàn)Spring的類/接口。
// Spring中的POJO(完全獨立于框架)
public class UserService {
public void addUser(String name) {
// 純業(yè)務(wù)邏輯
}
}
2. Spring如何實現(xiàn)非侵入式?
(1)依賴注入(DI)通過配置/注解實現(xiàn)
不需要實現(xiàn)特定接口,只需通過@Autowired或XML配置即可注入依賴:
@Service
public class OrderService {
@Autowired // 通過注解注入,不依賴Spring接口
private PaymentService paymentService;
}
(2)AOP通過代理模式實現(xiàn)
切面編程通過動態(tài)代理(JDK/CGLIB)增強功能,業(yè)務(wù)類無需感知:
@Transactional // 只需添加注解,不改變類繼承結(jié)構(gòu)
public void updateOrder(Order order) {
// 業(yè)務(wù)代碼
}
(3)模板模式消除樣板代碼
如JdbcTemplate封裝了JDBC的繁瑣操作,但你的DAO類無需繼承任何Spring類:
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate; // 直接使用,無需實現(xiàn)Spring接口
}
3. 非侵入式的核心優(yōu)勢
| 特性 | 侵入式框架 | Spring(非侵入式) |
|---|---|---|
| 代碼耦合度 | 高(依賴框架父類/接口) | 低(POJO + 配置/注解) |
| 可測試性 | 需依賴框架環(huán)境測試 | 可直接單元測試(無框架依賴) |
| 遷移成本 | 重構(gòu)代價高 | 輕松切換其他框架或去Spring化 |
| 靈活性 | 受框架設(shè)計限制 | 自由選擇技術(shù)組合 |
4. 對比其他框架
侵入式框架示例:
- Struts 1.x(Action需繼承
ActionForm) - EJB 2.x(需實現(xiàn)
SessionBean)
- Struts 1.x(Action需繼承
Spring的非侵入式體現(xiàn):
- 你的
UserService可以同時用于Spring、非Spring環(huán)境,甚至移植到Quarkus/Micronaut。 - 僅需修改配置(如從XML換為
@Bean),無需改動業(yè)務(wù)代碼。
- 你的
總結(jié)
Spring通過依賴注入、AOP代理、模板模式等設(shè)計,將框架能力以無感知方式注入到業(yè)務(wù)代碼中,使得開發(fā)者可以:
? 用原生Java對象編寫核心邏輯
? 按需選擇Spring功能(而非強制)
? 輕松遷移或與其他框架集成
這種設(shè)計正是Spring能成為Java生態(tài)基石的關(guān)鍵原因之一。
到此這篇關(guān)于Spring 依賴注入、AOP代理全方面解析的文章就介紹到這了,更多相關(guān)Spring 依賴注入AOP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jsp+dao+bean+servlet(MVC模式)實現(xiàn)簡單用戶登錄和注冊頁面
這篇文章主要介紹了jsp+dao+bean+servlet(MVC模式)實現(xiàn)簡單用戶登錄和注冊頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
SpringMVC中的ConversionServiceExposingInterceptor工具類解析
這篇文章主要介紹了SpringMVC中的ConversionServiceExposingInterceptor工具類解析,ConversionServiceExposingInterceptor是Spring MVC的一個HandlerInterceptor,用于向請求添加一個屬性,需要的朋友可以參考下2023-12-12
Springboot第三方j(luò)ar打不進jar里的問題分析及解決
文章介紹了如何解決在Maven項目中無法從maven倉庫找到的第三方j(luò)ar包問題,通過將這些jar包添加到本地庫,使用特定的命令設(shè)置groupId、artifactId、版本號、包類型和文件路徑,此方法適用于在Windows環(huán)境下的操作,并需要安裝Maven環(huán)境變量2025-10-10
springBoot之如何獲取接口請求數(shù)據(jù)和返回數(shù)據(jù)實現(xiàn)日志
這篇文章主要介紹了springBoot之如何獲取接口請求數(shù)據(jù)和返回數(shù)據(jù)實現(xiàn)日志問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04

