您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringAOP的介紹和使用方法”,在日常操作中,相信很多人在SpringAOP的介紹和使用方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringAOP的介紹和使用方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
AOP ,面向切面編程,在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。其實就是在代碼運行,進行一定的包裝,如在方法執行前、方法返回后、方法拋出異常后等地方進行一定的攔截處理或者叫增強處理
先講一下AspectJ和Spring AOP關系,網上很多文章對AspectJ存在錯誤說法
AspectJ:
AspectJ 來自于 Eclipse 基金會,是Eclipse托管給Apache基金會的一個開源項目
屬于靜態織入,它是通過修改代碼來實現的,它的織入時機可以是:
Compile-time weaving:編譯期織入
Post-compile weaving:也就是已經生成了 .class 文件,就要用到編譯后織入
Load-time weaving:指的是在加載類的時候進行織入
AspectJ框架非常強大,它是 AOP 編程的完全解決方案。Spring AOP 致力于解決的是企業級開發中最普遍的 AOP 需求(方法織入)
AspectJ 在實際代碼運行前完成了織入,所以大家會說它生成的類是沒有額外運行時開銷的
SpringAOP:
基于動態代理來實現。默認地,如果使用接口的,用 JDK 提供的動態代理實現,如果沒有接口,使用 CGLIB 實現
Spring AOP 和AspectJ并沒有什么太多的關系,僅僅是Spring 延用了 AspectJ 中的概念,包括使用了 AspectJ 提供的 jar 包中的注解,但是不依賴于其實現功能
Spring AOP 需要依賴于 IOC 容器來管理,只能作用于 Spring 容器中的 Bean,它是使用純粹的 Java 代碼實現的,只能作用于 bean 的方法
Spring AOP 比 AspectJ 的性能稍差
Joinpoint(連接點)
所謂連接點是指能夠被攔截到的點。在spring中,這些點指的是方法,因為spring只支持方法類型的連接點(任何一個方法都可以稱為連接點)
Pointcut(切入點)
切入點是指我們要對哪些Joinpoint進行攔截的定義(對哪個方法進行增強)
Advice(通知/增強)
通知是指攔截到Joinpoint之后所要做的事情就是通知.通知分為前置通知,后置通知,異常通知,最終通知,環繞通知(切面要完成的功能)(要給它增加什么功能)
Target(目標對象)
代理的目標對象
Weaving(織入)
是指把增強應用到目標對象來創建新的代理對象的過程(怎樣得到代理對象)
Proxy(代理)
一個類被AOP織入增強后,就產生一個結果代理類
Aspect(切面)
是切入點和通知的結合,構成切面,我們可以使用注解或者xml進行配置
1. 在 xml 中配置
開啟 @AspectJ 的注解,還有其它方式,這里不介紹
<aop:aspectj-autoproxy/>
2. 使用@Aspect注解
定義實現AOP的配置類
@Aspect 注解要作用在 bean 上面
@Component@Aspectpublic class LogAspect {}
3. 配置 Pointcut
用于定義哪些方法需要被增強或者說需要被攔截
@Pointcut(""execution(* com.ljj.service(..))"")private void controllerAspect() {// TODO Auto-generated method stub} @Pointcut("@annotation(com.ljj.annotation.Log)")private void controllerAspect1() {// TODO Auto-generated method stub}@Pointcut(""within(com.ljj.service..*)"")private void controllerAspect2() {// TODO Auto-generated method stub}@Pointcut("bean(*Service)")private void controllerAspect3() {// TODO Auto-generated method stub}
execution ,正則匹配方法簽名
@annotation。匹配對應注解的方法
within,指定所在類或所在包下面的方法
bean(idOrNameOfBean), 匹配 bean 的名字
4. 配置 Advice
@Aspectpublic class AdviceExample {// 下面方法就是寫攔截 "dao層實現"@Before("com.ljj.aop.dataAccessOperation()")public void doAccessCheck() {// ... 實現代碼}@Before("execution(* com.ljj.dao.*.*(..))")public void doAccessCheck() {// ... 實現代碼}@AfterReturning("com.ljj.aop.dataAccessOperation()")public void doAccessCheck() {// ...}@AfterReturning(pointcut="com.ljj.aop.dataAccessOperation()",returning="retVal")public void doAccessCheck(Object retVal) {// 這樣,進來這個方法的處理時候,retVal 就是相應方法的返回值,是不是非常方便// ... 實現代碼}// 異常返回@AfterThrowing("com.ljj.aop.dataAccessOperation()")public void doRecoveryActions() {// ... 實現代碼}@AfterThrowing(pointcut="com.ljj.aop.dataAccessOperation()",throwing="ex")public void doRecoveryActions(DataAccessException ex) {// ... 實現代碼}// 注意理解它和 @AfterReturning 之間的區別,這里會攔截正常返回和異常的情況@After("com.ljj.aop.dataAccessOperation()")public void doReleaseLock() {// 通常就像 finally 塊一樣使用,用來釋放資源。// 無論正常返回還是異常退出,都會被攔截到}// 既能做 @Before 的事情,也可以做 @AfterReturning 的事情@Around("com.ljj.businessService()")public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {// start stopwatchObject retVal = pjp.proceed();// stop stopwatchreturn retVal;}}
上面Advice都已經匹配了對應的PointCut,這樣定義可以不用再定義PointCut了。也可以使用下面這種PointCut + Advice
//定義日志注解@Target({ ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Log {//操作名String optName();//操作類型OperateType optType();//操作表名String optTable();//操作編碼String optCode(); } @Pointcut("@annotation(com.ljj.annotation.Log)")private void controllerAspect() {// TODO Auto-generated method stub}//日志切面@Around("controllerAspect()")public Object around(ProceedingJoinPoint pjp) throws Throwable { try { //方法執行前操作result = point.proceed();//方法執行后操作} catch (Exception e) {e.printStackTrace();}}
到此,關于“SpringAOP的介紹和使用方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。