一擂找、注解創(chuàng)建切面
@Aspect: 表明該類為切面
@Before: 通知方法會在目標(biāo)方法調(diào)用之前執(zhí)行
@After: 通知方法會在目標(biāo)方法返回或拋出異常后執(zhí)行
@AfterReturning: 通知方法會在目標(biāo)方法返回后執(zhí)行
@AfterThrowing: 通知方法會在拋出異常后執(zhí)行
@Around: 通知方法將目標(biāo)方法封裝起來
@Pointcut: 定義切點(diǎn)表達(dá)式
@EnableAspectJ-AutoProxy: 啟用自動(dòng)代理
execution(): 切點(diǎn)表達(dá)式
args(): 執(zhí)行方法參數(shù)
with(): 指定匹配類型
public interface Performance{
public void perform();
public void playTrack(int i);
}
@Aspect
public class Audience{
@Pointcut("execution(** concert.Performance.perform(..))")
public void perform(){}
@Pointcut("execution(** concert.Performance.playTrack(int)) && args(trackNum)")
public void playTrack(int trackNum){}
@Before("perform()")
public void silenceCellPhones(){
System.out.println("Silencing cell phones");
}
@Before("playTrack(trackNum)")
public void playTrack(int trackNum){
System.out.println("trackNum");
}
@AfterReturning("perform()")
public void applause(){
System.out.println("CLAP CLAP CLAP");
}
@AfterThrowing("perform()")
public void demandRefund(){
System.out.println("Demanding a refund");
}
}
@Configuration
@EnableAspectJ-AutoProxy
@ComponentScan
public class ConcertConfig{
@Bean
public Audience audience(){
return new Audience();
}
}
二、XML聲明切面
<aop:config>: 頂級AOP配置元素
<aop:aspect>: 定義一個(gè)切面
<aop:pointcut>: 定義一個(gè)切點(diǎn)
<aop:aspectj-autoproxy>: 啟用自動(dòng)代理
<aop:before>: AOP前置通知
<aop:after>: AOP后置通知(不管被執(zhí)行方法是否執(zhí)行成功)
<aop:after-returning>: AOP返回通知
<aop:after-throwing>: AOP異常通知
public interface Performance{
public void perform();
public void playTrack(int i);
}
public class Audience{
public void perform(){}
public void playTrack(int trackNum){}
public void silenceCellPhones(){
System.out.println("Silencing cell phones");
}
public void silenceCellPhones(int trackNum){
System.out.println("trackNum");
}
public void applause(){
System.out.println("CLAP CLAP CLAP");
}
public void demandRefund(){
System.out.println("Demanding a refund");
}
}
<aop:config>
<aop:aspect ref="audience">
<aop:pointcut
id="performance"
expression="execution(** concert.Performance.perform(..))" />
<aop:pointcut
id="trackCounter"
expression="execution(** concert.Performance.playTrack(int)) && args(trackNum)" />
<aop:before
pointcut-ref="performance"
method="silenceCellPhones" />
<aop:before
pointcut-ref="trackCounter"
method="playTrack" />
<aop:after-returning
pointcut-ref="performance"
method="applause" />
<aop:after-throwing
pointcut-ref="performance"
method="demandRefund" />
</aop:aspect>
</aop:config>