因Spring AOP导致@Autowired依赖注入失败的解决方法

2025-05-29 0 78

发现问题:

之前用springAOP做了个操作日志记录,这次在往其他类上使用的时候,service一直注入失败,找了网上好多内容,发现大家都有类似的情况出现,但是又和自己的情况不太符合。后来总结自己的情况发现:方法为private修饰的,在AOP适配的时候会导致service注入失败,并且同一个service在其他的public方法中就没有这种情况,十分诡异。

解决过程:

结合查阅的资料进行了分析:在org.springframework.aop.support.AopUtils中:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
public static boolean canApply(Pointcut pc, Class targetClass, boolean hasIntroductions) {

if (!pc.getClassFilter().matches(targetClass)) {

return false;

}

MethodMatcher methodMatcher = pc.getMethodMatcher();

IntroductionAwareMethodMatcher introductionAwareMethodMatcher = null;

if (methodMatcher instanceof IntroductionAwareMethodMatcher) {

introductionAwareMethodMatcher = (IntroductionAwareMethodMatcher) methodMatcher;

}

Set classes = new HashSet(ClassUtils.getAllInterfacesForClassAsSet(targetClass));

classes.add(targetClass);

for (Iterator it = classes.iterator(); it.hasNext();) {

Class clazz = (Class) it.next();

Method[] methods = clazz.getMethods();

for (int j = 0; j < methods.length; j++) {

if ((introductionAwareMethodMatcher != null &&

introductionAwareMethodMatcher.matches(methods[j], targetClass, hasIntroductions)) ||

methodMatcher.matches(methods[j], targetClass)) {

return true;

}

}

}

return false;

}

此处Method[] methods = clazz.getMethods();只能拿到public方法。

execution(* *(..)) 可以匹配public/protected的,因为public的有匹配的了,目标类就代理了,,,再进行切入点匹配时也是能匹配的,而且cglib方式能拿到包级别/protected方法,而且包级别/protected方法可以直接通过反射调用。

private 修饰符的切入点 无法匹配 Method[] methods = clazz.getMethods(); 这里的任何一个,因此无法代理的。 所以可能因为private方法无法被代理,导致@Autowired不能被注入。

修正办法:

1、将方法修饰符改为public;

2、使用AspectJ来进行注入。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对快网idc的支持。

原文链接:http://www.cnblogs.com/lcngu/p/6246950.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 因Spring AOP导致@Autowired依赖注入失败的解决方法 https://www.kuaiidc.com/115805.html

相关文章

发表评论
暂无评论