請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;
}
事情的起因是我有一個很簡陋的工廠。
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;
}
相關文章
- 教你如何使用Springboot注入帶引數的建構函式Spring Boot函式
- Spring基於建構函式和設值函式的依賴注入Spring函式依賴注入
- 建構函式建立物件函式物件
- 理解建構函式與原型物件函式原型物件
- 私有建構函式的物件建立例項函式物件
- 理清原型物件、 例項物件、建構函式原型物件函式
- EXTJS 建構函式帶引數JS函式
- Javascript 物件導向中的建構函式和原型物件JavaScript物件函式原型
- 主建構函式有啥用函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- 類的建構函式和解構函式函式
- 輕鬆理解建構函式和原型物件函式原型物件
- 建構函式與解構函式函式
- ## 建構函式函式
- 建構函式函式
- JS建構函式,原型鏈,原型物件總結JS函式原型物件
- JavaScript建構函式,物件導向程式設計JavaScript函式物件程式設計
- js Date()建構函式建立時間日期物件JS函式物件
- 建立派生類物件,建構函式的執行順序物件函式
- Java的建構函式Java函式
- 建構函式的作用函式
- 《JavaScript物件導向精要》之四:建構函式和原型物件JavaScript物件函式原型
- [譯] 建構函式已死,建構函式萬歲!函式
- C/C++——建構函式、複製建構函式和解構函式的執行時刻C++函式
- PHP 手冊 (類與物件) 學習筆記五:建構函式和解構函式PHP物件筆記函式
- C++ 建構函式和解構函式C++函式
- 關於建構函式與解構函式的分享函式
- c# tcbs之建構函式呼叫建構函式示例C#函式
- JavaScript物件導向之二(建構函式繼承)JavaScript物件函式繼承
- JS物件導向程式設計(二):建構函式JS物件程式設計函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 工廠模式建立物件和自定義建構函式建立物件的異同模式物件函式
- 前端建構函式、原型、例項物件之間的關係前端函式原型物件
- C++ 類建構函式和解構函式C++函式
- JavaScript 建構函式JavaScript函式
- 建構函式、this、static函式
- 建構函式與普通函式的區別函式
- javascript物件導向程式設計的建構函式的繼承JavaScript物件程式設計函式繼承