Spring 他のインスタンスをセッターインジェクションで使い回し


スポンサーリンク

Javaでクラスを使っていて、クラス内で他のインスタンスを参照することはよくあります。
そのときに、いちいちnewして、他のインスタンスに値を詰め込んで・・・なんてやるのは面倒くさい。

定義ファイルで定義したインスタンスがあるなら、そのインスタンスを使い回したいということはあるでしょう。

今回はそんなサンプルを見ていきましょう。

ディレクトリ構成は以下のようになります。

f:id:sho322:20140506161139j:plain

今回の肝はこちらです。

・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くんがインジェクションされています。