指在程式執行期間動態的將某段**切入到指定方法指定位置進行執行的程式設計方式;
1、匯入aop模組;spring aop:(spring-aspects)
2、定義乙個業務邏輯類(mathcalculator);在業務邏輯執行的時候將日誌進行列印(方法之前、方法執行結束、方法出現異常,***)
3、定義乙個日誌切面類(logaspects):切面類裡面的方法需要動態感知mathcalculator.div執行到**然後執行;
通知方法:
前置通知(@before):logstart:在目標方法(div)執行之前執行
後置通知(@after):logend:在目標方法(div)執行結束之後執行(無論方法正常結束還是異常結束)
返回通知(@afterreturning):logreturn:在目標方法(div)正常返回之後執行
異常通知(@afterthrowing):logexception:在目標方法(div)出現異常以後執行
環繞通知(@around):動態**,手動推進目標方法執行(joinpoint.procced())
4、給切面類的目標方法標註何時何地執行(通知註解);
5、將切面類和業務邏輯類(目標方法所在類)都加入到容器中;
6、必須告訴spring哪個類是切面類(給切面類上加乙個註解:@aspect)
[7]、給配置類中加 @enableaspectjautoproxy 【開啟基於註解的aop模式】
在spring中很多的 @enable***
新增業務邏輯類
public class mathcalculator
}
新增切面類
@aspect
public class logaspects ;
//@before在目標方法之前切入;切入點表示式(指定在哪個方法切入)
@before("pointcut()")
public void logstart(joinpoint joinpoint)"); }
@after("com.atguigu.aop.logaspects.pointcut()")
public void logend(joinpoint joinpoint)
//joinpoint一定要出現在參數列的第一位
@afterreturning(value="pointcut()",returning="result")
public void logreturn(joinpoint joinpoint,object result)"); }
@afterthrowing(value="pointcut()",throwing="exception")
public void logexception(joinpoint joinpoint,exception exception)");
}}
新增配置類
@enableaspectjautoproxy
@configuration
public class mainconfigofaop
//切面類加入到容器中
@bean
public logaspects logaspects()
}
測試類
@test
public void test01()
執行結果
實現aop需要三步
1)將業務邏輯元件和切面類都加入到容器中;告訴spring哪個是切面類(@aspect)
2)在切面類上的每乙個通知方法上標註通知註解,告訴spring何時何地執行(切入點表示式)
3)開啟基於註解的aop模式;@enableaspectjautoproxy
1)@enableaspectjautoproxy 開啟aop功能
2)@enableaspectjautoproxy 會給容器中註冊乙個元件 annotationawareaspectjautoproxycreator
3)annotationawareaspectjautoproxycreator是乙個後置處理器;
4)容器的建立流程:
1)registerbeanpostprocessors()註冊後置處理器;建立annotationawareaspectjautoproxycreator物件
2)finishbeanfactoryinitialization()初始化剩下的單例項bean
1)建立業務邏輯元件和切面元件
2)annotationawareaspectjautoproxycreator攔截元件的建立過程
3)元件建立完之後,判斷元件是否需要增強
是:切面的通知方法,包裝成增強器(advisor);給業務邏輯元件建立乙個**物件(cglib);
5)執行目標方法:
1)**物件執行目標方法
2)cglibaopproxy.intercept()攔截;
1)得到目標方法的***鏈(增強器包裝成***methodinterceptor)
2)利用***的鏈式機制,依次進入每乙個***進行執行;
3)執行效果:
正常執行:前置通知-》目標方法-》後置通知-》返回通知
出現異常:前置通知-》目標方法-》後置通知-》異常通知
spring 註解驅動 01
註解有 controller 標註是乙個控制層 service 標註是乙個業務層 repository 標註是乙個持久層 configuration 表示是乙個配置類 componentscan 表示掃瞄包與spring bean.xml檔案中的掃瞄包效果一致 下面看是示例 一 這是乙個配置類 pa...
spring註解驅動 Autowired
1.autowired 自動注入 1.預設優先按照型別去容器中找對應的元件,如果找到多個,則按照屬性名作為元件 的 id 去容器中查詢 2.qualifier 使用 qualifier指定需要裝配的元件id,而不是屬性名 自動裝配預設一定要將屬性賦值好,沒有就報錯。可以使用 autowired re...
spring註解驅動(二)
import 給容器中註冊元件的方式 包掃瞄 註解標註註解 controller service repository component 侷限於自己寫的類 bean 匯入第三方包裡面的元件 import 快速給容器匯入乙個元件 import 要匯入到容器的元件 容器中就會自動註冊這個元件,id預設...