现象

  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动态代理导致注解丢失问题及如何修改注解允许被继承相关推荐

  1. 深入理解Java Proxy和CGLIB动态代理原理

    点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...

  2. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  3. CGLib动态代理原理

    CGLib动态代理原理 CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法: 看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调 ...

  4. Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!

    作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...

  5. cglib动态代理jar包_Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!...

    作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...

  6. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...

  7. JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...

  8. 静态代理,JDK动态代理,Cglib动态代理详解

    目录 一.代理模式 二.静态代理 三.动态代理 3.1 JDK动态代理 3.2 Cglib动态代理 四.两种动态代理区别 一.代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式 ...

  9. CGLIB 动态代理用例及源码解析

    CGLIB 动态代理 参考链接:https://blog.csdn.net/yhl_jxy/article/details/80633194 参考链接:https://www.jianshu.com/ ...

最新文章

  1. Redis启动多端口,运行多实例(转)
  2. 高阶奇异值分解(HOSVD)理解
  3. Object Detection(目标检测神文)
  4. 用python公众号开书城步骤_资源 | 开放Python书籍:一本短小精悍的初学者入门指南...
  5. 测试linux nginx,linux系统肿么检测安装了nginx
  6. zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
  7. 一分钟了解四层/七层反向代理
  8. LwIP应用开发笔记之十:LwIP带操作系统基本移植
  9. concurrenthashmap为什么是线程安全_为什么SimpleDateFormat不是线程安全的?
  10. 问题TypeError: __init__() takes 1 positional argument but 2 were given解决方案
  11. Saltstack远程执行命令(3)
  12. linux监控进程资源,linux系统资源监控命令
  13. 形式语义学关于带权有向图最短路径的有模式函数算法
  14. screwing up
  15. 电赛总结(二)——AD芯片总结之AD7705
  16. Android键盘删除键问题
  17. 极光:2019年个人网盘行业研究报告
  18. autojs开发的多功能工具箱,源码量大慢慢消化,功能非常多
  19. Labview LabSQL下载
  20. 【C语言程序】已知一个长方体的高,通过输入长方体的长和宽,计算出长方体的体积

热门文章

  1. 手机版腐蚀rust_手机进水后黑屏,该怎么办?切忌做这几件事
  2. Centos7 Minimal安装常用工具包
  3. IntelliJ IDEA 2020 数据库连接Oracle和Mysql
  4. Navicat 12 连接oracle闪退问题
  5. Spring4.x整合Axis1.4发布WebService服务
  6. .class和getClass()的区别
  7. linux oracle11g开机,Linux 下Oracle11g 自动随系统启动
  8. python解析excel公式_[python][openpyxl]读取excel中公式的结果值
  9. 模型预测控制 索引超出数组元素的数目(0)。_C++基础总结(二):C++基本数据类型及流控制语句详解...
  10. cx_Oracle怎么打包,cx_Oracle 在执行包文件 function 时有多个出参该如何获取