发现问题
今天本来是为了解决一个Apollo
配置与Code
同时变更不一致问题,我需要去通过SPI
的方式去重写Apollo
刷新Remote
配置。所以,我就写一个很小的DEMO
来验证每次变更Apollo
配置对我服务端的取数。
@Data
@Component
public class MarketConfig {
@Value("${market.test.chenyuan}")
private String testName;
}
对应在Apollo
的配置
market.test.name = Test1111
Controller
层的代码
@Resource
private MarketConfig marketConfig;
@RequestMapping(value = "/sayHello", method = RequestMethod.POST)
private String sayHello(){ // 注意,这里由于我的不小心写成了private
return marketConfig.getMarketTestName();
}
然后我就发起请求来验证我的取数,结果给我报了NullpointException
的异常。因为这种代码几乎每天都在写,一下次说我的Bean
没有注入进来,还有点方。
然后,我细心的debug
了看了一下。如图所示:
http://static.cyblogs.com/Jietu20201204-085800.jpg
图片可以说明:
Spring
容器100%已经存在了MarketConfig
的Bean
对象;- 但是
MarketConfig
在该Controller
里面100%没有注入进来 ; this
显示出了一个代理的路径; 于是,我在同样的Controller
去请求另外一个Method
,但可以正常访问。
http://static.cyblogs.com/Jietu20201204-090305.jpg
Spring
容器100%已经存在了MarketConfig
的Bean
对象;- 而且是可以确定这次
MarketConfig
是有注入进来的(没有展示图,不太方便) this
直接是显示的自己的地址
由于我就比较了一下方法的区别,最主要的区别点就是在于一个是private
,另外一个是public
。
其实,这里我就很快明白了。因为我们这边在Controller
层做了一些AOP来做监控与埋点。现阶段主要用的是CAT
(现在做了很多的一些封装,后面可以分享下,如何做到无浸入性以及与Apollo
的打通)。
AOP
里面用的是反射机制,用private
修饰的类是注入失败的,因为拿不到,只能用public
或者protected
修饰。
参考地址
- https://blog.csdn.net/qq_31451081/article/details/84100575
如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管理员微信号:chengcheng222e
,他会拉你们进群。