コンストラクタ・インジェクション
コンストラクタ・インジェクションのときになぜindexやtypeを指定する必要があるのかわかっていなくて、半年ぐらい前からずっと疑問だった。xmlに定義した順にコンストラクタに引数渡せばいいじゃんと思ってた。
どうやらautowireと関係あるのかな。Springの場合、Seasarと違ってコンストラクタの引数に対して明示的な指定とautowrie(autoBinding)を混在させられる。たとえば引数が3つあるコンストラクタに対して2つは明示的に指定するけどのこりの1つはautowireとかできる。そのときに、indexやtypeを教えてあげないとどの値が何番目の引数になるのかコンテナは判断できない。
例はSpring入門記と似たかんじで。
taedium taediumの日記 http://d.hatena.ne.jp/taedium/
package nt.entity; import java.net.URL; public class Person { private String name; private URL url; private String description; public Person(String name, URL url, String description) { this.name = name; this.url = url; this.description = description; } public String toString() { return new StringBuffer() .append("name=").append(name).append(", ") .append("url=").append(url).append(", ") .append("description=").append(description).append(", ") .toString(); } }
package nt.spring.injection; import nt.entity.Person; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class ConstructorClient { private static final String PATH = "nt/spring/injection/a.xml"; public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(PATH)); Person p = (Person)factory.getBean("taedium"); System.out.println(p); } }
実行結果
name=taedium, url=http://d.hatena.ne.jp/taedium/, description=taediumの日記,
たぶん、コンストラクタの引数に対して明示的な指定とautowrieを混在させてもいいことないんじゃないかな。