栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring自定义注解失效的小坑和解决方案

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring自定义注解失效的小坑和解决方案

业务需求写了个自定义注解,作用域加在方法上的,使用方法如下:
class Test {
	@自定义注解
	public void methodA(){
	......
	}
}
写完了切面service和各种环绕方法后,测试了一下,生效了,于是提交,告诉队友们可以用起来,结果有一位伙计说注解不生效了,过去看,确实是加在方法上,不过是下面这样调用的:
class Test {
	
	public void methodA(){
	this.methodB();
	}

	@自定义注解
	public void methodB(){
	......
	}
}
失效的原理: 注解的原理就是通过切点进行动态代理,对原方法进行增强,有关动态代理和增强型方法可以看另外一博客:JAVA静态代理与动态代理(JDK和CGLIB) 而this.XXX这种内部调用方法,调用的是原class的方法,而不是增强后的 proxyClass,所以,自然环绕方法就不执行,注解就不生效。 解决方法: (1)增加一个新的Service类,新的Service类新增方法上加@自定义注解 注解,然后通过@Autowired 或者 @Resource 注解注入进行调用即可。这样会从容器中直接获取proxyClass。例如:Controller调Service,当前Service调用@Autowired进来的其它Service,反正就是不能this.method.
class testController {
	
	@Autowired
	private TestService testService;
	
	public methodA(){
		testService.methodB();
	}
}
class testService {
	@自定义注解	
	public methodB(){
		......
	}
}
(2)如果不想额外写一个Service类新增上报方法,想在当前类新增方法完成注解操作,操作如下: 1:当前类实现ApplicationContextAware并重写setApplicationContext方法


2:从applicationContext获取到当前类(记得用小写类名)

这样问题就完美解决了,最后总结一下: 一定要获得代理类调用其增强型方法,如果是直接调用会导致没走代理而注解失效。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号