初窥SpringAop
@Aspect : 声明这是一个拦截器
@Order(int) : 指定切面的优先级, 注意这是责任链模式的顺序, 前置通知 从小到大 ,后置通知 从大到小
@DeclareParents : 引入。当你想增强某个接口的实现,想额外搞点配料,但是你又不能修改这个接口,就可以通过引入一个新写的接口来增强原有实现。
举例: 你希望康师傅红烧牛肉面里有火腿香蕉, 但很明显你不能决定康师傅生产泡面时放什么配料,这里你就需要 引入 一个老八,让他来帮你强化你的泡面。
//这个注解有两个必填的属性,value和 defaultImpl: 前者是要增强的目标接口, 后者是引入的增强接口类。
@DeclareParents(value = "com.example.demo.service.serviceImpl.AopTestServiceImpl+",defaultImpl= DeclareAopServiceImpl.class)
public DeclareAopService DeclareAopService; //这就是你要新引入的接口。
Controller:
@Autowired
AopTestService AopTestServiceImpl;
@RequestMapping("/test")
public String test(){
DeclareAopService dclas = (DeclareAopService) AopTestServiceImpl ; // 这里转了类型,还记得代理的实现原理中的下挂吗。 Proxy.newInstance()这个函数的第二个参数
//target.getClass().getInterfaces() 类转后实际上传进去的是一个数组,分别把AopTestService 和DeclareAopService 两个接口传了进去。
dclas.takeAshit();
AopTestServiceImpl.sayHello("老八");
return "lahhe";
}
通知获取参数:
@Before("pointCut() && args(parameterName)")
public void before(String parameterName){
//前置
}
注: 尽量不要去使用环绕通知, 一般环绕通知用于大幅修改原有的逻辑实现,

浙公网安备 33010602011771号