cglib动态代理导致注解丢失问题及如何修改注解允许被继承
现象
SOAService这个bean先后经过两个BeanPostProcessor,会发现代理之后注解就丢失了。
开启了cglib代理
@SpringBootApplication @EnableAspectJAutoProxy(proxyTargetClass = true) public class Application {public static void main(String[] args) {SpringApplication app = new SpringApplication(Application.class);app.run(args);} }
为什么开启这个代理模式呢
http://www.cnblogs.com/hujunzheng/p/8428422.html
如何解决这个问题
在自定义注解上添加@Inherited。如果是第三方的注解,调整项目接口层或者拿到这个注解通过代码方式加上@Inherited注解, 或者如下图所示。
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {Service anon = bean.getClass().getAnnotation(Service.class);if (anon != null) {try {InvocationHandler h = Proxy.getInvocationHandler(anon);//设置@Service注解支持继承,应对动态代理导致类上的@Service注解丢失Field typeField = h.getClass().getDeclaredField("type");typeField.setAccessible(true);Field annotationTypeField = Class.class.getDeclaredField("annotationType");annotationTypeField.setAccessible(true);AnnotationType annotationType = (AnnotationType) annotationTypeField.get(typeField.get(h));Field inheritedField = AnnotationType.class.getDeclaredField("inherited");this.updateFinalModifiers(inheritedField);inheritedField.set(annotationType, true);// 获取 AnnotationInvocationHandler 的 memberValues 字段Field memberValuesField = h.getClass().getDeclaredField("memberValues");// 因为这个字段事 private final 修饰,所以要打开权限memberValuesField.setAccessible(true);// 获取 memberValuesMap memberValues = (Map) memberValuesField.get(h);Service service = Stream.of(bean.getClass().getInterfaces()).filter(iface -> iface.getAnnotation(Service.class) != null).collect(Collectors.toList()).get(0).getAnnotation(Service.class);memberValues.put("version", service.version());memberValues.put("group", service.group());} catch (Exception e) {throw new BeanCreationException(String.format("%s %s %s %s %s", "修改", ClassUtils.getQualifiedName(bean.getClass()), "的注解", ClassUtils.getQualifiedName(Service.class), "的 group值和version值出错"), e);}}return bean; }
参考链接:Annotation和动态代理
转载于:https://www.cnblogs.com/hujunzheng/p/8433980.html
cglib动态代理导致注解丢失问题及如何修改注解允许被继承相关推荐
- 深入理解Java Proxy和CGLIB动态代理原理
点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...
- Java Proxy和CGLIB动态代理原理
动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...
- CGLib动态代理原理
CGLib动态代理原理 CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法: 看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调 ...
- Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!
作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...
- cglib动态代理jar包_Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!...
作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...
- JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理
JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...
- 静态代理,JDK动态代理,Cglib动态代理详解
目录 一.代理模式 二.静态代理 三.动态代理 3.1 JDK动态代理 3.2 Cglib动态代理 四.两种动态代理区别 一.代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式 ...
- CGLIB 动态代理用例及源码解析
CGLIB 动态代理 参考链接:https://blog.csdn.net/yhl_jxy/article/details/80633194 参考链接:https://www.jianshu.com/ ...
最新文章
- Redis启动多端口,运行多实例(转)
- 高阶奇异值分解(HOSVD)理解
- Object Detection(目标检测神文)
- 用python公众号开书城步骤_资源 | 开放Python书籍:一本短小精悍的初学者入门指南...
- 测试linux nginx,linux系统肿么检测安装了nginx
- zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
- 一分钟了解四层/七层反向代理
- LwIP应用开发笔记之十:LwIP带操作系统基本移植
- concurrenthashmap为什么是线程安全_为什么SimpleDateFormat不是线程安全的?
- 问题TypeError: __init__() takes 1 positional argument but 2 were given解决方案
- Saltstack远程执行命令(3)
- linux监控进程资源,linux系统资源监控命令
- 形式语义学关于带权有向图最短路径的有模式函数算法
- screwing up
- 电赛总结(二)——AD芯片总结之AD7705
- Android键盘删除键问题
- 极光:2019年个人网盘行业研究报告
- autojs开发的多功能工具箱,源码量大慢慢消化,功能非常多
- Labview LabSQL下载
- 【C语言程序】已知一个长方体的高,通过输入长方体的长和宽,计算出长方体的体积
热门文章
- 手机版腐蚀rust_手机进水后黑屏,该怎么办?切忌做这几件事
- Centos7 Minimal安装常用工具包
- IntelliJ IDEA 2020 数据库连接Oracle和Mysql
- Navicat 12 连接oracle闪退问题
- Spring4.x整合Axis1.4发布WebService服务
- .class和getClass()的区别
- linux oracle11g开机,Linux 下Oracle11g 自动随系统启动
- python解析excel公式_[python][openpyxl]读取excel中公式的结果值
- 模型预测控制 索引超出数组元素的数目(0)。_C++基础总结(二):C++基本数据类型及流控制语句详解...
- cx_Oracle怎么打包,cx_Oracle 在执行包文件 function 时有多个出参该如何获取