请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;
}

o(╯□╰)o 望指教

这里有一个边界问题,就象自然界所谓领地问题。

request属于Web容器 Web标准管辖,而Spring本身都要被加载到Web容器中,所以,它不可能管到它的上级部门管的request,所以没法把他给你注册进去。

当然,如果是纯粹从注入角度讲,你注入request逻辑上很对,但是不管用,不如你自己手工注入有用,只能说明框架这玩意虚假性。

这个情况应该在JavaEE 6的CDI(Contexts and Dependency Inject)中解决了,将request等容器场景和依赖注入融合在一起,http://www.andygibson.net/blog/index.php/2009/12/16/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/
[该贴被banq于2010-03-24 10:16修改过]

2010年03月24日 09:32 "banq"的内容
这里有一个边界问题,就象自然界所谓领地问题。

request属于Web容器 Web标准管辖,而Spring本身都要被加载到Web容器中,所以,它不可能管到它的上级部门管的request,所以没法把他给你注册进去。

当然,如果是纯 ...


多谢指教,原来是由于公司古老的框架限制了,框架内制定了一系列规则,在框架内只能顺势而为。要改变现状只能跳出框架或者采用更高版本的框架吧。囧,对一个运行了几年的老系统来说,更改框架是一个人很难做到的,曾经先进的东西又制约了当前的发展。大概是世事皆如此吧。