Spring 他のインスタンスをセッターインジェクションで使い回し
Javaでクラスを使っていて、クラス内で他のインスタンスを参照することはよくあります。
そのときに、いちいちnewして、他のインスタンスに値を詰め込んで・・・なんてやるのは面倒くさい。
定義ファイルで定義したインスタンスがあるなら、そのインスタンスを使い回したいということはあるでしょう。
今回はそんなサンプルを見ていきましょう。
ディレクトリ構成は以下のようになります。
今回の肝はこちらです。
・Girl.java
package sample; public class Girl { private Person boyFriend; private String name; private int age; public Person getBoyFriend() { return boyFriend; } public void setBoyFriend(Person boyFriend) { this.boyFriend = boyFriend; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "My name is " + name + "\n" + "My age is " + age + "\n" + "My boyfriend is " + boyFriend.getName(); } }
これのプロパティに、
private Person boyFriend;
とあることに注目です。
このPersonクラスは、以下のようなクラスで、こいつを定義ファイルに定義して、インジェクションします。
Person.java
package sample; public class Person { private String name; private int age; public Person(){ } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void hello() { System.out.println("hello world!"); } public void goodbye() { System.out.println("Good bye..."); } }
さて、おまちかねの定義ファイルですが、以下のように書きます。
<?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"> <bean name="person" class="sample.Person"> <constructor-arg index="0" value="Takeshi" /> <constructor-arg index="1" value="28" /> </bean> <bean name="girl" class="sample.Girl"> <property name="boyFriend" ref="person" /> <property name="name" value="hanako" /> <property name="age" value="27" /> </bean> <bean id="calendar" class="java.util.Calendar" factory-method="getInstance" /> </beans>
で、実行する。
Example1.java
package di; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import sample.Girl; import sample.Person; public class Example1 { public static void main(String[] args) throws InterruptedException { ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring-config.xml"}); Girl hanako = context.getBean("girl",Girl.class); System.out.println(hanako.toString()); } }
すると、以下のように表示されます。
My name is hanako My age is 27 My boyfriend is Takeshi
ちゃんとPersonで定義したtakeshiくんがインジェクションされています。