Spring學習01--初學者關於AOP和DI的理解
依賴注入DI
Spring通過應用上下文Application Context裝載bean的定義並把他們組裝起來
例如:knight.xml中的bean是通過XML來進行配置,可以選擇*ClassPathXMLApplicationContext*作為應用上下文
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/knight.xml");
Knight knight = context.getBean(Knight.class);
knight.embarkOnQuest();
context.close();
上述過程中,通過knight完成embarkOnQuest方法,但該類完全不知道knight這個bean物件具體對應的類是哪個,也不知道embarkOnQuest方法具體執行了什麼。從而實現了程式的鬆耦合,該方式即依賴注入DI。
AOP:面向切面程式設計,可理解為覆蓋在多個元件上的外殼,與核心業務無關的通用服務以宣告的方式靈活地應用到系統中,核心應用甚至感覺不到它的存在。
優點:提高了核心程式碼的內聚,符合面向對面程式設計的思想
如建立一個吟遊詩人類來記錄騎士相關探險故事
public class Minsterl(){
private PrintStream stream;
punlic Minsterl(){
this.stream = stream;
}
public void singBeforeQuest(){
stream.println("騎士開始冒險");
}
public void singAfterQuest(){
stream.println("騎士冒險結束");
}
}
可以看到 吟遊詩人 Minster 只是一個簡單的POJO類,如下兩種方式實現騎士冒險前後進行傳頌。
public class BraveKnight implents Knight(){
private Quest quest;
private Minsterl minsterl;
public BraveKnight(Quest quest,Minsterl minsterl){
this.quest = quest;
this.minsterl = minsterl;
}
public void embarkOnQuest(){
minsterl.singBeforeQuest();
quest.embark();
minsterl.singAfterQuest();
}
}
上面的程式碼實現了 在knight執行embarkOnQuest任務的前後吟遊詩人minster記錄了騎士冒險的前後,但knight的任務就是embarOnQuest,吟遊詩人的記錄動作是否需要其來管理呢,是不是執行任務前還有校驗吟遊詩人是否存在,這就使程式碼變得複雜化。而AOP就是專門用來解決這個問題的。
在kngiht.xml中加入如下配置:
<bean id="minstrel" class="xxxx.Minstrel">
<constructor-arg value="#(T(System).out)"/>
</bean>
<aop:config>
<aop:aspect ref="minstrel">
<aop:pointcut id="embark" expression="execution(* *.embarkOnQuest(...))"/>
<aop:before pointcut-ref="embark" method="singBeforeQuest"/>
<aop:after pointcut-after="embark" method="singAfterQust"/>
</aop:aspect>
</aop:config>
上訴配置首先將Minstrel 宣告為一個bean物件minstrel,然後通過<aop:aspect ref=“minstrel”>將該bean物件定義為一個切面,切點位置<aop:pointcut id=“embark” expression=“execution(* *.embarkOnQuest(…))”/>為BraveKnight的embarkOnQuest方法,然後宣告<aop:before pointcut-ref=“embark” mehtod=“singBeforeQuest”>在呼叫embarkOnQuest
方法之前執行singBeforeQuest方法,再由<aop:after pointcut-ref=“embark” mehtod=“singAfterQuest”>宣告embarkOnQuest執行完畢後呼叫singAfterQuest方法。
可以看到,通過AOP,實現了核心業務邏輯與通用服務的分離,實現了降耦。
相關文章
- 對於Spring中AOP,DI,IoC概念的理解Spring
- Spring(二):IOC和DI的理解Spring
- 對於初學者學習web前端,關於書籍方面的推薦Web前端
- Spring-boot整合AOP及AOP相關學習Springboot
- 關於Spring Aop和事務記錄Spring
- Spring學習之——手寫Spring原始碼V2.0(實現IOC、DI、MVC、AOP)Spring原始碼MVC
- spring:spring再總結(ioc、aop、DI等)Spring
- 如何理解Spring中的IOC和AOPSpring
- Laravel 初學者學習點滴Laravel
- 初學者學習程式設計的方法程式設計
- Spring AOP學習筆記01:AOP概述Spring筆記
- GIT初學者詳細指令學習Git
- LINUX初學者(學習資料)Linux
- CCNA初學者學習經驗!(轉)
- 適用於初學者的完整雲端計算學習路線指南
- 關於Spring AOP與IOC的個人思考Spring
- Spring AOP學習筆記05:AOP失效的罪因Spring筆記
- Spring AOP概念理解Spring
- 關於linux多執行緒fork的理解和學習Linux執行緒
- 作為初學者,Python和PHP哪個好學習?PythonPHP
- 初學者:關於用java實現並行Java並行
- Python適合初學者學習嗎?Python
- 初學者學習Rust容易碰到的問題 - timRust
- 適用於初學者的基本 kubectl 和 Helm 命令
- Spring AOP學習筆記02:如何開啟AOPSpring筆記
- 輕鬆理解 Spring AOPSpring
- Spring Aop簡單理解Spring
- 關於Struts的學習和使用
- SAP UI5 初學者教程的學習目錄UI
- 學習筆記—給Linux初學者的建議筆記Linux
- SSM框架學習之Spring的AOP學習以及資料整理SSM框架Spring
- 淺析Spring的IoC和DISpring
- 給Java開發初學者的10個學習建議,助你學習事半功倍!Java
- 給Java開發初學者的10個學習建議,助你學習事半功倍Java
- 關於CI,ASCS,DI的區別
- 深入理解Spring AOP 1.0Spring
- 初學者想問一個關於Struts路徑的問題
- 哪種程式語言適合初學者學習