私はSpringフレームワークに手を出しています。ここでは、bean 宣言で「parent」属性を試していましたが、
これは、CommonCar.java の以下のコードです。
package com.justPractise.ex01;
public class CommonCar {
private String modelName;
private String engine;
public CommonCar(String modelName){
this.modelName = modelName;
System.out.println(" PARAMETERISED "+this.getClass().getName()+" INITIALISED..... ");
}
public CommonCar(){
System.out.println(this.getClass().getName()+" INITIALISED..... ");
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
@Override
public String toString(){
StringBuffer strb = new StringBuffer();
strb.append("\nDEFAULT CAR ");
strb.append(this.modelName);
strb.append("\nENGINE NAME ");
strb.append(this.engine);
return strb.toString();
}
}
以下は、CustomCar.java のコードです。
package com.justPractise.ex01;
public class CustomCar {
private String modelName;
private String engine;
public CustomCar(){
System.out.println(this.getClass().getName()+" INITIALISED..... ");
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
@Override
public String toString(){
StringBuffer strb = new StringBuffer();
strb.append("\nDEFAULT CAR ");
strb.append(this.modelName);
strb.append("\nENGINE NAME ");
strb.append(this.engine);
return strb.toString();
}
}
これは bean-jojo.xml ファイルです。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-lazy-init="true">
<bean class="com.justPractise.ex01.CommonCar" id="commonCAR">
<constructor-arg value="TATA-SAFARI V30" />
<property name="engine" value="2340 CC FOUR CYLINDER 1700 BHP ENGINE" />
</bean>
<bean class="com.justPractise.ex01.CustomCar" id="customCAR" parent="commonCAR">
<property name="modelName" value="TOYOTA-INNOVA" />
</bean>
</beans>
これは、コマンドラインから実行する main メソッドを持つクラスです。
package com.justPractise.ex01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainPractise01 {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext ctx = null;
CustomCar obj = null;
try{
ctx = new ClassPathXmlApplicationContext("bean-jojo.xml");
obj = (CustomCar) ctx.getBean("customCAR");
System.out.println(obj);
}catch(Exception e){
e.printStackTrace();
}
}
}
上記のプログラムを実行すると、コマンド プロンプトに次のエラーが表示されます。
[java] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customCAR' defined in class path resource
[bean-jojo.xml]: 1 constructor arguments specified but no matching constructor found in bean 'customCAR' (hint: specify index/type/name
arguments for simple parameters to avoid type ambiguities)
しかし、bean-jojo.xml に次の変更を加えると、プログラムは正常に動作します。
<bean class="com.justPractise.ex01.CommonCar" id="commonCAR">
<property name="modelName" value="TATA-SAFARI V30" />
<property name="engine" value="2340 CC FOUR CYLINDER 1700 BHP ENGINE" />
</bean>
これは、xml で上記の変更を行うことによって得られる期待される出力です。
[java] com.justPractise.ex01.CustomCar INITIALISED.....
[java]
[java] DEFAULT CAR TOYOTA-INNOVA
[java] ENGINE NAME 2340 CC FOUR CYLINDER 1700 BHP ENGINE
[echo] Java running completed
では、bean-jojo.xml の CommonCar 宣言のコンストラクター引数が機能しない理由を教えていただけますか? コメントお待ちしております