spring之Autowired小坑
spring引进注解之后大大简化了xml的配置,上手spring变得更加简单起来。本人也是刚刚上手spring不久,开始一头雾水到能够依葫芦画瓢花了一个月,到现在公司需要的基本的spring配置都能独自搞定了,可见上手spring还是比较容易的。但是须知spring这么牛逼的框架应该不会是一两个月就能hold住的玩意,今天又踩了两个坑,记录一下。
公司的service调用采取的是远程调用方式,各个部门把各自对外提供的service用192.168.0.1:4080/services/XXX这样的url暴露出来,在浏览器中是可以直接调用的,相应地spring配置service的时候就不像平时自己写代码的时候配个com.xx.##impl这样了,而是用url的方式。背景介绍完毕。
我在引用xxService的时候,不仅在spring-bean.xml中配置了,也在引用它的类中使用了@Autowired标注了它,又有set方法,总之我认为所有跟装配有关的条件全部都加上了,自以为多重保证绝壁不会有bean初始化的问题。结果一运行却还是爆了错,大惑不解。花了一个多小时才找到了问题所在。
原因在于@Autowired找适合的bean的时候是采取byType方式的,意思是如果我有个AService以及一个AServiceImpl实现了AService,为AService标注了@Autowired则会先去你的代码结构中找到看看有没有AServiceImpl这样一个类,如果有就自动装配,没有就报错。而先前已经提过了,这是远程service,我的代码结构里肯定是找不到这个impl类的,因此即使我在spring-bean.xml中配置过同名的bean,autowired也没法自动装配,解决方案非常简单,去掉autowired即可,那样就变成了byName的方式去找了。这个故事告诉我们不要画蛇添足。
如果强行要用Autowired的话。。。
还可以加个@Qualifier限定死名字让Autowired知道用byName来找吧。