ltsopensource / light-task-scheduler

Distributed Scheduled Job Framework
Apache License 2.0
3.01k stars 1.15k forks source link

修复spring使用CGLib做代理时,@LTS @JobRunnerItem 等注解无法被解析的问题 #394

Closed fqdeng closed 1 year ago

fqdeng commented 6 years ago

部分Bean 加上@Transactional注解 会生成子类,子类的实例无法被扫描到, 测试加上@Inherited 可解决这个问题

zhaoyuguang commented 6 years ago

这种方式无法解决cglib代理的方法

fqdeng commented 6 years ago

@zhaoyuguang cglib不是生成子类吗

fqdeng commented 6 years ago

@zhaoyuguang 我测试过了,,能够修复 @LTS@JobRunnerItem 无法被扫描到的问题,,希望修复

fqdeng commented 6 years ago

@qq254963746

fqdeng commented 6 years ago

@hongliangpan @lusong1986

qdliurui commented 6 years ago

@inherited有时候不好使 后Application启动 需要增加 @EnableAspectJAutoProxy(exposeProxy = true) //是否启用 代理 默认false 增加此处@LTS @JobRunnerItem 生效 可能各自环境不一样

fqdeng commented 6 years ago

@qdliurui 关闭aop代理不好吧,

qdliurui commented 6 years ago

@jonwinters 目前没有增加@enableaspectjautoproxy(exposeProxy = true) :修改源码JobRunnerHolder对addLTSBean做了个静态判断。最好是用@inherited的继承方式使注解生效。

fqdeng commented 6 years ago

@qdliurui 有分支吗,我参考一下。

fqdeng commented 6 years ago

问题已经解决了 给@LTS 加上@Inherited 注解 @Inherited 对方法不生效 所以@JobRunnerItem不用加

修改为 image

使用spring core自带的 findAnnotation方法,这个方法的实现,不仅会在自身的类的方法上搜索注解 同时会在父类跟接口的方法上搜索注解

image

image

另外希望lts 早点有人来接手维护

fqdeng commented 6 years ago

@qdliurui

zhaoyuguang commented 6 years ago

AnnotationUtils.findAnnotation 实现原理可以说一下么 @jonwinters

fqdeng commented 6 years ago

@zhaoyuguang 这个是Spring Core包下的工具类,Spring自身有大量的地方使用 CGLib 实现,这个方法的原理 注释上有说明

image

这个方法会遍历input 这个方法的 super method CGLib是生成子类实现,所以能找到Annotation