美文网首页
springboot中service @Autowired突然为

springboot中service @Autowired突然为

作者: 我爱福尔摩斯呀 | 来源:发表于2021-04-19 17:26 被阅读0次

    最近SpringCloud项目中突然有个模块中的一个Controller中的 @Autowired Service突然变成null了,没有修改过相关的业务代码。想来想去这个问题是出在加了个AOP的日志记录模块之后才出现的。
    仔细搜索了找到了答案。

    这个问题是由于Controller中注入的Service或方法用的修饰符是private,而使用Spring AOP要确认目标方法的修饰符不为private

    以下是转载的原理:原地址:https://www.cnblogs.com/bmwsl/p/11280613.html

    Spring的aop机制使用的是jdk自身的动态代理机制或者cglib的代理机制实现,分别基于接口和子类继承机制实现。
    再具体到 spring aop部分的源码
    Method[] methods = clazz.getMethods();
    用JAVA反射的方式获取也只能拿到public/protected方法,所以private方法无法被代理 , 最终导致bean注入失败。
    综上,这其实是个很简单的问题,但是在编码不规范,或者旧项目改造这类场景中会出现而且不容易发现的问题,开发人员往往执念于未对原方法逻辑有任何改动而忽略掉。使用新加入的切面要确认目标方法的修饰符不为private。

    相关文章

      网友评论

          本文标题:springboot中service @Autowired突然为

          本文链接:https://www.haomeiwen.com/subject/ewtwlltx.html