请Spring如何注入带有构造函数的对象呢?
首先不怕大家见笑的,我之前没用过Spring框架,只是见过相关介绍(囧 一直都用产品开发 BO+jsp。。。)。。。
事情的起因是我有一个很简陋的工厂。
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
/**
* @author Antinomy 规格工厂
*/
public class SpecificationFactory
{
public ActionForm _form;
public HttpServletRequest _request;
public SpecificationFactory(ActionForm form, HttpServletRequest request)
{
this._form = form;
this._request = request;
}
public iSpecification getSqlSpecificationInstance(String factoryType)
{
iSpecification spn = null;
if (factoryType.equals("grsb_jkqk"))
spn = new Grsb_Jkqk_WebiSpecification(_form, _request);
if (factoryType.equals("tjbb_sbrshsjetj"))
spn = new Tjbb_sbrshsjetj_WebiSpecification(_form, _request);
if (factoryType.equals("Yhs_dwsbjk"))
spn = new Yhs_dwsbjk_WebiSpecification(_form, _request);
if (factoryType.equals("Yhs_dwsbjkmx"))
spn = new Yhs_dwsbjkmx_WebiSpecification(_form, _request);
if (factoryType.equals("Zgfx_zb")
|| factoryType.equals("Zgfx_dj")
|| factoryType.equals("Zgfx_rk")
|| factoryType.equals("Zgfx_sb"))
spn = new Zgfx_Tjrq_WebiSpecification(_form, _request);
return spn;
}
}
如果要增加新的规格,就需要修改这个工厂类。所以打算尝试用依赖注入来解决
配置如下
<bean id="HttpServletRequest" class="javax.servlet.http.HttpServletRequest">
<bean id="ActionForm" class="org.apache.struts.action.ActionForm">
<bean id="Grsb_Jkqk" class="Grsb_Jkqk_WebiSpecificatio">
<constructor-arg > <ref bean="HttpServletRequest"/></constructor-arg>
<constructor-arg > <ref bean="ActionForm"/> </constructor-arg>
</bean>
于是修改getSqlSpecificationInstance方法
public iSpecification getSqlSpecificationInstance(String factoryType)
{
iSpecification spn = null;
InputStream is = new FileInputStream("bean.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
//....
iSpecification spn = (iSpecification) factory.getBean("Grsb_Jkqk");
return spn;
}
囧,于是在new Grsb_Jkqk_WebiSpecification对象的时候,因为没有传入构造参数,异常了。
看了一些例子,都是关于一些常用类型了,另外我也很纳闷,在factory.getBean("Grsb_Jkqk")的
时候也没有指明如何传入 _form, _request这些参数,所以我的第一场spring之旅以失败告终o(╯□╰)o
Orz,望高手指教
后来我也在想 我不过就是简单让spring来帮助管理对象的而已,为什么非得搞得很复杂。
在忙活了一天之后,我放弃了用spring,改用java 反射来实现。不过只是后话了。。
public iSpecification getWebiSpecificationInstance(
String WebiSpecificationName)
{
iSpecification spn = null;
try
{
String _classCfg = "SpecificationClass.Properties";
_classProps = FileService.LoadProperties(request,_classCfg);//配置文件
String className = this._classProps.getProperty(WebiSpecificationName);
class targetClass = Class.forName(className);
class [] parmType=new Class []{ActionForm.class,HttpServletRequest.class};
Object [] parmValue= new Object []{_form, _request};
Constructor constructor = targetClass.getConstructor(parmType);
spn = (iSpecification)constructor.newInstance(parmValue);
}
catch ( ClassNotFoundException e ) { e.printStackTrace(); }
catch ( InstantiationException e ) { e.printStackTrace(); }
catch ( IllegalAccessException e ) { e.printStackTrace(); }
catch ( SecurityException e ) { e.printStackTrace(); }
catch ( NoSuchMethodException e ) { e.printStackTrace(); }
catch ( InvocationTargetException e ) { e.printStackTrace(); }
catch ( Exception e ) { e.printStackTrace(); }
return spn;
}