日期:2014-05-18  浏览次数:20575 次

spring 的注入问题,请大神指教
一个action类中
....
@Resource
protected DepartmentService departmentService;
......

DepartmentServiceImpl是DepartmentService 的实现类
使用组件自动扫描机制
@Service
DepartmentServiceImpl

我没有显示指定 departmentService 指向的是DepartmentServiceImpl的对象,为什么Spring帮我这样做了,假如DepartmentService 有多个实现类,spring会怎么装配。
spring

------解决方案--------------------
@Resource应用在setter上(应用到属性),则注入规则是:
   a.先使用属性名字匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败
   b.如果属性名字没有匹配到Bean则spring会尝试采用属性参数类型匹配,如果找打bean则注入,如果属性参数类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个
bean的异常.注入失败.

如果intefaces 有多个实现,且自己不指定具体哪个实现,就会报错。
------解决方案--------------------
虽然没有显式指定,但实际上DepartmentServiceImpl实现了DepartmentService就等于是指定了,如果多个实现类的话不妨试一下,按楼上说的,会报错,我觉得也是
------解决方案--------------------
如果多个类的话会报NoUniqueBeanDefinitionException异常,因为,如果你的@Resource注解不注明名字的话,spring默认在bean容器中按名字查找对应bean,找不到的话,会转为按类型查找对应的bean,也就是spring自动去找对应接口的实现类,但如果你的多个类实现了注解@Resource下的接口的话,就会出现错误,也就是上面的这个异常,由异常名字我想你知道什么意思了吧?