今天就跟大家聊聊有關怎么在spring中實現一個aop注解,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
注解方式實現aop我們主要分為如下幾個步驟:
1.在切面類(為切點服務的類)前用@Aspect注釋修飾,聲明為一個切面類。
2.用@Pointcut注釋聲明一個切點,目的是為了告訴切面,誰是它的服務對象。(此注釋修飾的方法的方法體為空,不需要寫功能比如 public void say(){};
就可以了,方法名可以被候命的具體服務功能所以引用,它可以被理解為切點對象的一個代理對象方法)
3.在對應的方法前用對應的通知類型注釋修飾,將對應的方法聲明稱一個切面功能,為了切點而服務
4.在spring配置文件中開啟aop注釋自動代理。如: <aop:aspectj-autoproxy/>
這樣講可能還是很抽象,那么,廢話不多說,我們代碼說話,代碼如下:
騎士類:(看過上一篇內容的就知道騎士是什么東西了,嘿嘿嘿)
package com.cjh.aop2; import org.springframework.stereotype.Component; /** * @author Caijh * * 2017年7月11日 下午3:53:19 */ @Component("knight") public class BraveKnight { public void saying(){ System.out.println("我是騎士..(切點方法)"); } }
切面類:(注釋主要在這里體現)
package com.cjh.aop2; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; /** * @author Caijh * email:codecjh@163.com * 2017年7月12日 上午9:31:43 */ /** * 注解方式聲明aop * 1.用@Aspect注解將類聲明為切面(如果用@Component("")注解注釋為一個bean對象,那么就要在spring配置文件中開啟注解掃描,<context:component-scan base-package="com.cjh.aop2"/> * 否則要在spring配置文件中聲明一個bean對象) * 2.在切面需要實現相應方法的前面加上相應的注釋,也就是通知類型。 * 3.此處有環繞通知,環繞通知方法一定要有ProceedingJoinPoint類型的參數傳入,然后執行對應的proceed()方法,環繞才能實現。 */ @Component("annotationTest") @Aspect public class AnnotationTest { //定義切點 @Pointcut("execution(* *.saying(..))") public void sayings(){} /** * 前置通知(注解中的sayings()方法,其實就是上面定義pointcut切點注解所修飾的方法名,那只是個代理對象,不需要寫具體方法, * 相當于xml聲明切面的id名,如下,相當于id="embark",用于供其他通知類型引用) * <aop:config> <aop:aspect ref="mistrel"> <!-- 定義切點 --> <aop:pointcut expression="execution(* *.saying(..))" id="embark"/> <!-- 聲明前置通知 (在切點方法被執行前調用) --> <aop:before method="beforSay" pointcut-ref="embark"/> <!-- 聲明后置通知 (在切點方法被執行后調用) --> <aop:after method="afterSay" pointcut-ref="embark"/> </aop:aspect> </aop:config> */ @Before("sayings()") public void sayHello(){ System.out.println("注解類型前置通知"); } //后置通知 @After("sayings()") public void sayGoodbey(){ System.out.println("注解類型后置通知"); } //環繞通知。注意要有ProceedingJoinPoint參數傳入。 @Around("sayings()") public void sayAround(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("注解類型環繞通知..環繞前"); pjp.proceed();//執行方法 System.out.println("注解類型環繞通知..環繞后"); } }
spring配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 開啟注解掃描 --> <context:component-scan base-package="com.cjh.aop2"/> <!-- 開啟aop注解方式,此步驟s不能少,這樣java類中的aop注解才會生效 --> <aop:aspectj-autoproxy/> </beans>
測試代碼:
package com.cjh.aop2; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * * @author Caijh * email:codecjh@163.com * 2017年7月11日 下午6:27:06 */ public class Test { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("com/cjh/aop2/beans.xml"); BraveKnight br = (BraveKnight) ac.getBean("knight"); br.saying(); } }
運行結果:
注解類型環繞通知..環繞前
注解類型前置通知
我是騎士..(切點方法)
注解類型環繞通知..環繞后
注解類型后置通知
========================分割線===================================
因為使用了注解方式,所以配置文件少了很多內容,只需要一句<context:component-scan base-package="com.cjh.aop2"/>
聲明要掃描的包,框架會自動掃描注釋并生成bean對象。有個@Component("knight")
這個注釋,和<bean id="knight" class="com.cjh.aop2.BraveKnight"/>
這個配置時一樣的意思,框架會自動識別并創建名為knight的BraveKnight對象。所以有了注釋,只需要開啟注釋掃描配置就好了,無需再做相同的bean配置。
如果運行過程中出現Spring aop : error at ::0 can't find referenced pointcut sleepPonit
的錯誤,那么很可能是spring的包的版本問題,
我用的是spring4的版本,然后還需要加aspectjrt-1.7.4.jar和aspectjweaver-1.7.4.jar兩個包
下載地址:http://xiazai.jb51.net/201708/yuanma/aspectjrt_aspectjweaver(jb51.net).rar
工程目錄如下:(打碼碼的類不用管,只是為了不為大家造成誤導,所以劃掉了)
通知注解類型如下:
看完上述內容,你們對怎么在spring中實現一個aop注解有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。