问题描述
- spring配置set注入时,properties中的name只能使用先前配置过的bean的id。 10C
-
<bean id=""EmployeeAction"" scope=""prototype"" class=""com.tw.web.action.EmployeeAction""> <property name=""employeeDao"" ref=""employeeDao""/> <property name=""baseDao"" ref=""employeeDao""/> <property name=""dao"" ref=""employeeDao""/></bean>
以上三种情况:
第一种(employeeDao):可以正确注入
第二种(baseDao):由于配置中有一个id=""baseDao""的抽象bean,所以会报错:baseDao这bean是一个抽象bean。
第三种(dao):根本不进入set中。
先前我一直纳闷为什么name和ref的字符串不一样就不能够正确注入。直到看到第二种配置报的错,才发现name直接就对应了配置中bean的id了。
是这样的:
我的配置中确实存在一个id=""baseDao""的抽象类
但是在注入时,baseDao只是一个属性。相当于:
public void setBaseDao(IEmployeeDao employeeDao){}
我的配置是:<property name=""baseDao"" ref=""employeeDao"" />
那么Spring按理应该是通过ref去找id=""employeeDao""的bean然后注入到setBaseDao中。
但是我遇到的问题是,Spring是通过name去找id=""baseDao""的bean。
另外,<property name=""id"" value=""1"" />
这样的形式也不行。
奇怪的是,配置SessionFactory的时候并没有问题。
刚刚在相关提问中找到一个解决方法:把Struts配置中的class=""类全限定名"",改成Spring配置的bean的id就行了。还是想请问一下有谁知道是什么问题吗?
谢谢各位!
解决方案
解决方案二:
抽象的bean无法被实例化的,当然它也不存在idname等属性了,这些是在没学习框架之前就知道的,现在你用设值注入来为一个抽象的类创建对象并初始化,怎么可以呢?
解决方案三:
注入时候 name 和 之前配置的id 是没有关系的,只要是相同的类型就行了。但是你的EmployeeAction 里面的set方法要与name一致
setBaseDao (employeeDao baseDao){ this.baseDao =baseDao;}
解决方案四:
<property name=""baseDao"" ref=""employeeDao""/>name是写在你类中的名称baseDao,ref是你写在类中名称baseDao对应的bean的id