注解方式實(shí)現(xiàn)aop我們主要分為如下幾個(gè)步驟(有更好的方法的話,歡迎交流):
1.在切面類(為切點(diǎn)服務(wù)的類)前用@Aspect注釋修飾,聲明為一個(gè)切面類。
2.用@Pointcut注釋聲明一個(gè)切點(diǎn),目的是為了告訴切面,誰(shuí)是它的服務(wù)對(duì)象。(此注釋修飾的方法的方法體為空,不需要寫功能比如 public void say(){};就可以了,方法名可以被候命的具體服務(wù)功能所以引用,它可以被理解為切點(diǎn)對(duì)象的一個(gè)代理對(duì)象方法)
3.在對(duì)應(yīng)的方法前用對(duì)應(yīng)的通知類型注釋修飾,將對(duì)應(yīng)的方法聲明稱一個(gè)切面功能,為了切點(diǎn)而服務(wù)
4.在spring配置文件中開啟aop注釋自動(dòng)代理。如:<aop:aspectj-autoproxy/>
可能很抽象,那么廢話不多說(shuō),代碼如下:
1、創(chuàng)建你的業(yè)務(wù)方法(切點(diǎn)方法)
package com.lnj.aop;
import org.springframework.stereotype.Component;
@Component("knight")
public class BraveKnight {
public void saying(){
System.out.println("我是業(yè)務(wù)方法類..(切點(diǎn)方法)");
}
}
2、切面類:(注釋主要在這里體現(xiàn))
package com.lnj.aop;
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;
/**
* 注解方式聲明aop
* 1.用@Aspect注解將類聲明為切面(如果用@Component("")注解注釋為一個(gè)bean對(duì)象,那么就要在spring配置文件中開啟注解掃描,<context:component-scan base-package="com.lnj.aop"/>
* 否則要在spring配置文件中聲明一個(gè)bean對(duì)象)
* 2.在切面需要實(shí)現(xiàn)相應(yīng)方法的前面加上相應(yīng)的注釋,也就是通知類型。
* 3.此處有環(huán)繞通知,環(huán)繞通知方法一定要有ProceedingJoinPoint類型的參數(shù)傳入,然后執(zhí)行對(duì)應(yīng)的proceed()方法,環(huán)繞才能實(shí)現(xiàn)。
*/
@Component("annotationTest")
@Aspect
public class AnnotationTest {
//定義切點(diǎn)
@Pointcut("execution(* *.saying(..))")
public void sayings(){}
/**
* 前置通知(注解中的sayings()方法,其實(shí)就是上面定義pointcut切點(diǎn)注解所修飾的方法名,那只是個(gè)代理對(duì)象,不需要寫具體方法,
* 相當(dāng)于xml聲明切面的id名,如下,相當(dāng)于id="embark",用于供其他通知類型引用)
* <aop:config>
<aop:aspect ref="mistrel">
<!-- 定義切點(diǎn) -->
<aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
<!-- 聲明前置通知 (在切點(diǎn)方法被執(zhí)行前調(diào)用) -->
<aop:before method="beforSay" pointcut-ref="embark"/>
<!-- 聲明后置通知 (在切點(diǎn)方法被執(zhí)行后調(diào)用) -->
<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("注解類型后置通知");
}
//環(huán)繞通知。注意要有ProceedingJoinPoint參數(shù)傳入。
@Around("sayings()")
public void sayAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("注解類型環(huán)繞通知..環(huán)繞前");
pjp.proceed();//執(zhí)行方法
System.out.println("注解類型環(huán)繞通知..環(huán)繞后");
}
}
3、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.lnj.aop"/>
<!-- 開啟aop注解方式,此步驟s不能少,這樣java類中的aop注解才會(huì)生效 -->
<aop:aspectj-autoproxy/>
</beans>
4、啟動(dòng)測(cè)試代碼:
package com.lnj.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("com/lnj/aop/beans.xml");
BraveKnight br = (BraveKnight) ac.getBean("knight");
br.saying();
}
}
運(yùn)行結(jié)果:
注解類型環(huán)繞通知..環(huán)繞前
注解類型前置通知
我是業(yè)務(wù)方法類..(切點(diǎn)方法)
注解類型環(huán)繞通知..環(huán)繞后
注解類型后置通知
========================分割線===================================
因?yàn)槭褂昧俗⒔夥绞?,所以配置文件少了很多?nèi)容,只需要一句<context:component-scan base-package="com.lnj.aop"/>聲明要掃描的包,框架會(huì)自動(dòng)掃描注釋并生成bean對(duì)象。有個(gè)@Component("knight")這個(gè)注釋,和<bean id="knight" class="com.lnj.aop.BraveKnight"/>這個(gè)配置時(shí)一樣的意思,框架會(huì)自動(dòng)識(shí)別并創(chuàng)建名為knight的BraveKnight對(duì)象。所以有了注釋,只需要開啟注釋掃描配置就好了,無(wú)需再做相同的bean配置。
如果運(yùn)行過(guò)程中出現(xiàn)Spring aop : error at ::0 can't find referenced pointcut sleepPonit的錯(cuò)誤,那么很可能是spring的包的版本問(wèn)題,
工程目錄如下:
通知注解類型如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-656016.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-656016.html
到了這里,關(guān)于Java注解方式實(shí)現(xiàn)aop,切點(diǎn)切面實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!