spring 的注入问题,请大神指教
一个action类中
....
@Resource
protected DepartmentService departmentService;
......
DepartmentServiceImpl是DepartmentService 的实现类
使用组件自动扫描机制
@Service
DepartmentServiceImpl
我没有显示指定 departmentService 指向的是DepartmentServiceImpl的对象,为什么Spring帮我这样做了,假如DepartmentService 有多个实现类,spring会怎么装配。
------解决方案--------------------@Resource应用在setter上(应用到属性),则注入规则是:
a.先使用属性名字匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败
b.如果属性名字没有匹配到Bean则spring会尝试采用属性参数类型匹配,如果找打bean则注入,如果属性参数类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个
bean的异常.注入失败.
如果intefaces 有多个实现,且自己不指定具体哪个实现,就会报错。
------解决方案--------------------虽然没有显式指定,但实际上DepartmentServiceImpl实现了DepartmentService就等于是指定了,如果多个实现类的话不妨试一下,按楼上说的,会报错,我觉得也是
------解决方案--------------------如果多个类的话会报NoUniqueBeanDefinitionException异常,因为,如果你的@Resource注解不注明名字的话,spring默认在bean容器中按名字查找对应bean,找不到的话,会转为按类型查找对应的bean,也就是spring自动去找对应接口的实现类,但如果你的多个类实现了注解@Resource下的接口的话,就会出现错误,也就是上面的这个异常,由异常名字我想你知道什么意思了吧?