初窥SpringAop

@Aspect : 声明这是一个拦截器

@Order(int) : 指定切面的优先级, 注意这是责任链模式的顺序, 前置通知 从小到大 ,后置通知 从大到小

@DeclareParents :  引入。当你想增强某个接口的实现,想额外搞点配料,但是你又不能修改这个接口,就可以通过引入一个新写的接口来增强原有实现。

举例:  你希望康师傅红烧牛肉面里有火腿香蕉, 但很明显你不能决定康师傅生产泡面时放什么配料,这里你就需要 引入 一个老八,让他来帮你强化你的泡面。

  //这个注解有两个必填的属性,valuedefaultImpl:  前者是要增强的目标接口, 后者是引入的增强接口类。

 

@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() 类转后实际上传进去的是一个数组,分别把
AopTestServiceDeclareAopService 两个接口传了进去。
    dclas.takeAshit();
AopTestServiceImpl.sayHello("老八");
return "lahhe";
}
 

 

通知获取参数:

@Before("pointCut() && args(parameterName)")

public void before(String parameterName){

  //前置

}

注: 尽量不要去使用环绕通知, 一般环绕通知用于大幅修改原有的逻辑实现, 

 

posted @ 2020-05-07 18:17  赤鱿  阅读(102)  评论(0)    收藏  举报