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

依賴(lài)注入之set注入

這里最后一行的理解,先能找到是哪一個(gè)set方法,再找到形參對(duì)應(yīng)的實(shí)際參數(shù)到底在哪里。
外部 Bean
- 在 Spring 配置文件中單獨(dú)定義
- 可以被多個(gè)其他 Bean 引用
- 有自己獨(dú)立的 ID/名稱(chēng)
<!-- 外部 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)部定義
- 只能被當(dāng)前 Bean 使用
- 沒(méi)有獨(dú)立的 ID/名稱(chēng)
<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 |
|---|---|---|
| 作用域 | 全局可用 | 僅限當(dāng)前 Bean 內(nèi)部使用 |
| 生命周期 | 由容器管理 | 隨外部 Bean 創(chuàng)建和銷(xiāo)毀 |
| 是否可重用 | 是,可被多個(gè) Bean 引用 | 否,只能被當(dāng)前 Bean 使用 |
構(gòu)造注入
set注入在創(chuàng)建對(duì)象之后,而構(gòu)造注入在創(chuàng)建對(duì)象的時(shí)候就注入了。
xml解析+工廠模式+反射機(jī)制
IoC思想的一種具體實(shí)現(xiàn)是依賴(lài)注入DI
八大框架

兩個(gè)核心模塊 IoC AOP
AOP
ORM(Object-Relational Mapping,對(duì)象關(guān)系映射) 是一種編程技術(shù),用于在 面向?qū)ο缶幊陶Z(yǔ)言(如 Java、Python)中的對(duì)象與 關(guān)系型數(shù)據(jù)庫(kù)(如 MySQL、PostgreSQL)的表之間建立映射關(guān)系,從而讓開(kāi)發(fā)者能夠以操作對(duì)象的方式間接操作數(shù)據(jù)庫(kù),無(wú)需直接編寫(xiě)復(fù)雜的 SQL 語(yǔ)句。
Spring的非侵入體現(xiàn)在哪里
Spring框架的非侵入式(Non-Invasive)設(shè)計(jì)是其核心哲學(xué)之一,指的是它不會(huì)強(qiáng)制要求你的代碼必須依賴(lài)Spring特定的類(lèi)或接口,而是允許你以原生方式編寫(xiě)業(yè)務(wù)邏輯,僅在需要時(shí)通過(guò)配置或注解引入Spring的能力。以下是具體分析:
1. 什么是“非侵入式”?
傳統(tǒng)框架的侵入性:
例如早期的EJB 2.x,要求業(yè)務(wù)類(lèi)必須繼承特定父類(lèi)或?qū)崿F(xiàn)指定接口(如SessionBean),代碼與框架深度耦合。
// EJB 2.x的侵入式寫(xiě)法(必須實(shí)現(xiàn)框架接口)
public class UserService implements SessionBean {
// 必須實(shí)現(xiàn)框架方法
public void ejbActivate() {}
// 業(yè)務(wù)邏輯...
}
Spring的非侵入性:
你的類(lèi)可以是純POJO(Plain Old Java Object),無(wú)需繼承或?qū)崿F(xiàn)Spring的類(lèi)/接口。
// Spring中的POJO(完全獨(dú)立于框架)
public class UserService {
public void addUser(String name) {
// 純業(yè)務(wù)邏輯
}
}
2. Spring如何實(shí)現(xiàn)非侵入式?
(1)依賴(lài)注入(DI)通過(guò)配置/注解實(shí)現(xiàn)
不需要實(shí)現(xiàn)特定接口,只需通過(guò)@Autowired或XML配置即可注入依賴(lài):
@Service
public class OrderService {
@Autowired // 通過(guò)注解注入,不依賴(lài)Spring接口
private PaymentService paymentService;
}
(2)AOP通過(guò)代理模式實(shí)現(xiàn)
切面編程通過(guò)動(dòng)態(tài)代理(JDK/CGLIB)增強(qiáng)功能,業(yè)務(wù)類(lèi)無(wú)需感知:
@Transactional // 只需添加注解,不改變類(lèi)繼承結(jié)構(gòu)
public void updateOrder(Order order) {
// 業(yè)務(wù)代碼
}
(3)模板模式消除樣板代碼
如JdbcTemplate封裝了JDBC的繁瑣操作,但你的DAO類(lèi)無(wú)需繼承任何Spring類(lèi):
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate; // 直接使用,無(wú)需實(shí)現(xiàn)Spring接口
}
3. 非侵入式的核心優(yōu)勢(shì)
| 特性 | 侵入式框架 | Spring(非侵入式) |
|---|---|---|
| 代碼耦合度 | 高(依賴(lài)框架父類(lèi)/接口) | 低(POJO + 配置/注解) |
| 可測(cè)試性 | 需依賴(lài)框架環(huán)境測(cè)試 | 可直接單元測(cè)試(無(wú)框架依賴(lài)) |
| 遷移成本 | 重構(gòu)代價(jià)高 | 輕松切換其他框架或去Spring化 |
| 靈活性 | 受框架設(shè)計(jì)限制 | 自由選擇技術(shù)組合 |
4. 對(duì)比其他框架
侵入式框架示例:
- Struts 1.x(Action需繼承
ActionForm) - EJB 2.x(需實(shí)現(xiàn)
SessionBean)
- Struts 1.x(Action需繼承
Spring的非侵入式體現(xiàn):
- 你的
UserService可以同時(shí)用于Spring、非Spring環(huán)境,甚至移植到Quarkus/Micronaut。 - 僅需修改配置(如從XML換為
@Bean),無(wú)需改動(dòng)業(yè)務(wù)代碼。
- 你的
總結(jié)
Spring通過(guò)依賴(lài)注入、AOP代理、模板模式等設(shè)計(jì),將框架能力以無(wú)感知方式注入到業(yè)務(wù)代碼中,使得開(kāi)發(fā)者可以:
? 用原生Java對(duì)象編寫(xiě)核心邏輯
? 按需選擇Spring功能(而非強(qiáng)制)
? 輕松遷移或與其他框架集成
這種設(shè)計(jì)正是Spring能成為Java生態(tài)基石的關(guān)鍵原因之一。
到此這篇關(guān)于Spring 依賴(lài)注入、AOP代理全方面解析的文章就介紹到這了,更多相關(guān)Spring 依賴(lài)注入AOP內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Swing中依據(jù)鼠標(biāo)拖拽來(lái)畫(huà)出矩形的實(shí)現(xiàn)方法
這篇文章主要介紹了Swing中依據(jù)鼠標(biāo)拖拽來(lái)畫(huà)出矩形的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
如何實(shí)現(xiàn)Spring?Event(異步事件)
這篇文章主要介紹了如何實(shí)現(xiàn)Spring?Event(異步事件)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
SpringBoot+Mybatis使用Enum枚舉類(lèi)型總是報(bào)錯(cuò)No enum constant&n
這篇文章主要介紹了SpringBoot+Mybatis使用Enum枚舉類(lèi)型總是報(bào)錯(cuò)No enum constant XX問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java8實(shí)現(xiàn)對(duì)List<Integer>的求和
這篇文章主要介紹了Java8實(shí)現(xiàn)對(duì)List<Integer>的求和方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

