为了说明这个问题,作者用伪码故事来描述。
今天psdjm来到一家公司入职,发现公司的代码对日志处理非常不利,全部直接硬编码在代码中,没有统一处理。代码如下
Psdjm同学马上想到,有没有可能通过AOP统一操作项目日志?说出来就写代码。
然后,开发完成后,对大方红酒进行简单测试,发现aop运行正常,达到了效果。
然后psdjm把项目上线,上线1分钟后,突然有很多方法在线报错,导致NPE异常。
快速回滚代码。后来,psdjm检查了代码,发现项目中有人将控制器中的方法写成了private。
至关重要的是,在添加aop之前,该方法正常工作。一旦添加了aop,UserService发现它不能被注入到spring容器中,这导致了NPE。
分析原因
Spring处理@autowire注释当bean实例化时,在初始化之前。另一方面,控制器类生成代理在bean初始化后生成。此时,虽然代理继承了控制器对象的属性并具有@autowire注释,但spring不再处理@autowire注释。因此,原始控制器在春季正常生成,autowire生效,代理在春季稍后添加到容器中,autowire不生效。
由于私有的方法不会被代理类调用到原始类,因此无法获得注入的属性。公共方法可以。
这就是为什么会出现以下现象。