在上一節(jié)中,講到了三個(gè)注解@Around @Before @After,通過(guò)這些操作可以在方法執(zhí)行前后執(zhí)行某些操作。如果我們有個(gè)方法想實(shí)現(xiàn)aop,根據(jù)我們上節(jié)所講的,要先找到切入點(diǎn),然后再對(duì)這個(gè)切入點(diǎn)進(jìn)行前后操作。從上面的邏輯可以看出,我們每次想要方法實(shí)現(xiàn)aop就要都要做一些重復(fù)的操作,大大影響力代碼的簡(jiǎn)潔和可讀性。
首先我們?cè)O(shè)想一下有沒(méi)有一種方法,只要我們?cè)谙胍獙?shí)現(xiàn)aop的方法上面加個(gè)標(biāo)記就能實(shí)現(xiàn)aop的功能。是的大家可能想到了,這個(gè)標(biāo)記就是注解。
原始切面定義:
@Aspect
@Component
public class AopServiceImpl {
@Pointcut("execution(* com.aop.aop.controller..*(..))")
public void record(){
System.out.println("hahahha");
}
@Before("record()")
public void before(){
System.out.println("before................");
}
}
從代碼可以看出,切點(diǎn)指向的是個(gè)范圍,在此范圍內(nèi)所有的方法都實(shí)現(xiàn)了Aop,在實(shí)際開(kāi)發(fā)中我們可能只需要某各類(lèi)中的某個(gè)方法實(shí)現(xiàn)aop,因此我們可以將切點(diǎn)Pointcut精確到某個(gè)方法
@Pointcut("execution(* com.aop.aop.controller.SysController.sayHello())")
public void record(){
System.out.println("hahahha");
}
@Before("record()")
public void before(){
System.out.println("before................");
}
一個(gè)方法還好只需定義一次,如果多個(gè)方法需要使用同一個(gè)advice,就要聲明多個(gè)切點(diǎn),顯然這種方法會(huì)造成大量重復(fù)代碼影響代碼可讀性。為了解決此類(lèi)問(wèn)題我們引入@annotation()
我們先定義一個(gè)注解:
@Target({ElementType.METHOD}) //聲明注解作用在方法上面
@Retention(RetentionPolicy.RUNTIME) //注解保留至運(yùn)行時(shí)
public @interface AopInter {
}
改良后的advice
@Aspect
@Component
public class NewAopSerivceImpl {
@Before("@annotation(com.aop.aop.AopInter)") //該advice作用在有@AopInter注解的方法下面
public void before(){
System.out.println("before................");
}
}
測(cè)試執(zhí)行sayHello,與syGoodBye
@Controller
public class SysController {
@GetMapping("/sayHello")
@ResponseBody
public String sayHello(){
System.out.println("執(zhí)行結(jié)果................hello");
return "hello";
}
@GetMapping("/syGoodBye")
@AopInter
public String syGoodBye(){
System.out.println("執(zhí)行結(jié)果................goodBye");
return "goodBye";
}
}
結(jié)果
執(zhí)行結(jié)果................hello
before................
執(zhí)行結(jié)果................goodBye
可以看出syGoodBye使用該adivce,sayHello并沒(méi)有使用。因此如果有方法想使用該adivce只需加上@AopInter注解即可。