为了说明这个问题,作者用伪代码+故事的形式来描述。今天A同学来一家公司上班,发现公司的代码对日志处理很烂。都是在代码中直接硬编码输出,没有统一处理。代码如下,A同学,立马想到,是不是可以通过AOP对项目日志进行统一操作呢?说起来,我直接写代码开发完成后,小A进行了简单的测试,发现aop运行正常,达到了效果。随后小A启动了这个项目。上线1分钟,突然线上很多方法报错,出现NPE异常,赶紧回滚代码。后来小A查看代码,发现项目中有人把controller中的方法写成了private。最重要的是,在添加aop之前,方法运行正常。一旦添加了aop,UserService发现无法注入。进入弹簧容器,导致NPE。分析一下Spring在bean实例化的时候处理@autowire注解的原因,在初始化之前。controller类生成代理在bean初始化后生成。此时虽然proxy继承了controller对象的属性,并且有@autowire注解,但是spring并没有处理@autowire注解。所以,原来的controller在spring中正常生成,autowire生效,在spring后面添加agent到容器中,autowire不生效。由于私有方法不会被代理类调用到原类,所以无法获取注入的属性。公共方法是可能的。所以才会出现下面的现象。结论在controller方法中,不要写私有的RequestMapping方法,否则一不小心就会掉坑里。
