请Spring如何注入带有构造函数的对象呢?

10-03-23 Antinomy

首先不怕大家见笑的,我之前没用过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;

}

4
Antinomy
2010-03-23 18:54

o(╯□╰)o 望指教

banq
2010-03-24 09:32

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

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修改过]

Antinomy
2010-03-24 14:17

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

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

当然,如果是纯 ...

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