Spring⾃定义注解失效的⼩坑和解决⽅案
业务需求写了个⾃定义注解,作⽤域加在⽅法上的,使⽤⽅法如下:
class Test {
@⾃定义注解
public void methodA(){
......
}
}
写完了切⾯service和各种环绕⽅法后,测试了⼀下,⽣效了,于是提交,告诉队友们可以⽤起来,结果有⼀位伙计说注解不⽣效了,过去看,确实是加在⽅法上,不过是下⾯这样调⽤的:
class Test {
public void methodA(){
}
@⾃定义注解
public void methodB(){
......
}
}
失效的原理:
注解的原理就是通过切点进⾏动态代理,对原⽅法进⾏增强,有关动态代理和增强型⽅法可以看另外⼀博客:
⽽this.XXX这种内部调⽤⽅法,调⽤的是原class的⽅法,⽽不是增强后的 proxyClass,所以,⾃然环绕⽅法就不执⾏,注解就不⽣效。
解决⽅法:
(1)增加⼀个新的Service类,新的Service类新增⽅法上加@⾃定义注解注解,然后通过@Autowired 或者 @Resource 注解注⼊进⾏调⽤即可。这样会从容器中直接获取proxyClass。例如:Controller调Service,当前Service调⽤
@Autowired进来的其它Service,反正就是不能hod.
class testController {
@Autowired
private TestService testService;
public methodA(){
}
}
class testService {
@⾃定义注解
public methodB(){
......
}
}
(2)如果不想额外写⼀个Service类新增上报⽅法,想在当前类新增⽅法完成注解操作,操作如下:
1:当前类实现ApplicationContextAware并重写setApplicationContext⽅法
2:从applicationContext获取到当前类(记得⽤⼩写类名)
这样问题就完美解决了,最后总结⼀下:
⼀定要获得代理类调⽤其增强型⽅法,如果是直接调⽤会导致没⾛代理⽽注解失效。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论