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-boot整合AOP及AOP相關學習Springboot
- Spring學習之——手寫Spring原始碼V2.0(實現IOC、DI、MVC、AOP)Spring原始碼MVC
- 對於初學者學習web前端,關於書籍方面的推薦Web前端
- Spring AOP學習筆記01:AOP概述Spring筆記
- 關於linux多執行緒fork的理解和學習Linux執行緒
- Spring AOP學習筆記05:AOP失效的罪因Spring筆記
- SSM框架學習之Spring的AOP學習以及資料整理SSM框架Spring
- 關於Spring Aop和事務記錄Spring
- Spring AOP學習筆記02:如何開啟AOPSpring筆記
- spring:spring再總結(ioc、aop、DI等)Spring
- 如何理解Spring中的IOC和AOPSpring
- 自動機器學習和AI初學者指南機器學習AI
- Laravel 初學者學習點滴Laravel
- 適用於初學者的基本 kubectl 和 Helm 命令
- 深入學習Spring框架(三)- AOP面向切面Spring框架
- 作為初學者,Python和PHP哪個好學習?PythonPHP
- 關於Apache Tika的學習和使用Apache
- Python適合初學者學習嗎?Python
- GIT初學者詳細指令學習Git
- Spring自學之路---AOPSpring
- 適用於初學者的完整雲端計算學習路線指南
- 慕課網《探秘Spring AOP》學習總結Spring
- Spring AOP概念理解Spring
- git學習:關於origin和masterGitAST
- 初學者學習Rust容易碰到的問題 - timRust
- XML學習筆記(一):關於字元編碼的理解XML筆記字元
- 關於ModeAnalytics的學習
- 關於HTTP的學習HTTP
- 關於Fragement的學習
- 關於SQLMAP的學習SQL
- Spring5.0原始碼學習系列之Spring AOP簡述Spring原始碼
- 基於docker 初學 MongoDb 學習筆記DockerMongoDB筆記
- Spring學習筆記2(IOC註解方式&AOP)Spring筆記
- 初學者的機器學習入門實戰教程!機器學習
- 給初學者一些學習Python的建議Python
- SAP UI5 初學者教程的學習目錄UI
- Spring AI 初學SpringAI