Springステップアップの道(6)-抽象BeanとファクトリBeanおよびBeanのidの取得


いくつかのクラスのパラメータの一部が重複している場合があります.これらの重複したパラメータにかかわらず、特にこれらのパラメータが多く、多くのbeanで使用されている場合、プロファイルが肥大化します.では、最も良い方法は、これらの重複したものを抽出して共通のモジュールに置くことです.では、私が必要とするときは、直接引用すればいいです.javaのクラスの継承のように、同じ部分を共通のモジュールに置くことができます.
抽象Bean
次に例を示します.
package com.siti.spring20160305;

public interface Person {

	void printName();
	
}
WangYangこのクラスはPersonというインタフェースを実現した.
package com.siti.spring20160305;

public class WangYang implements Person{

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void printName() {
		System.out.println("My name is wangyang!" + this.name);
	}
	
}

同様のWYクラスもこのインタフェースを実現した
package com.siti.spring20160305;

public class WY implements Person{

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void printName() {
		System.out.println("My name is wy!" + this.name);
	}
	
	
}

プロファイルでは、abstract="true"という抽象Beanに設定します.これにより、参照を行うときに親Beanの情報をparent="*"で参照します.



	
	
	 
	 
	 	
	 
	 
	
	
	
	
	

テストコード
package com.siti.spring20160305;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext20160305.xml");
		Person wangyang = context.getBean("wangyang", Person.class);
		wangyang.printName();
		
		Person wy = context.getBean("wy", Person.class);
		wy.printName();
	}

}

工場Bean
先のブログではファクトリについて言及しましたが、以前のファクトリはファクトリモードでしたが、今のところ特別なBeanではFactoryBeanインタフェースを実装し、そのメソッドを実装しなければなりません.プログラムがgetBeanでインスタンスを取得すると、実装されたメソッドのgetObjectメソッドの戻り値が返されます.
3つの方法:
1.getObject():Beanのインスタンスを返す
2.getobjectType():Beanによって生成されたjavaインスタンスの実装クラスを返します.
3.isSingleton():単一モードかどうか.
このクラスはFactoeyBeanインタフェースを実装し、以下のようにします.
package com.siti.spring20160305factorybean;

import java.lang.reflect.Field;

import org.springframework.beans.factory.FactoryBean;

public class WangYang implements FactoryBean{

	private String targetClass;
	private String targetField;

	public String getTargetField() {
		return targetField;
	}

	public void setTargetField(String targetField) {
		this.targetField = targetField;
	}

	public String getTargetClass() {
		return targetClass;
	}

	public void setTargetClass(String targetClass) {
		this.targetClass = targetClass;
	}

	@Override
	public Object getObject() throws Exception {
		//           
		Class> clazz = Class.forName(this.targetClass);
		//       
		Field field = clazz.getField(targetField);
		//     
		return field.get(null);
	}

	@Override
	public Class> getObjectType() {
		return null;
	}

	@Override
	public boolean isSingleton() {
		return false;
	}

}
プロファイル



	 
	 	
	 	
	 
	 

テストコード:
package com.siti.spring20160305factorybean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext20160305.xml");
		System.out.println(context.getBean("wangyang"));
	}
}

BeanのIDを取得
場合によっては、Beanのidを事前に知る必要がある場合がありますが、次の例では、BeanNameAwareインタフェースを使用して、プロファイルで構成されているidを取得する方法を示します.
構成ファイルがBeanをインスタンス化している間に、クラスがBeanName Awareというインタフェースを実装していることが検出されると、setBeanNameメソッドでBeanのidがパラメータbeanNameとしてクラスのプロパティに注入されます.
BeanNameAwareインタフェースを実装し、その方法を実装します.
package com.siti.spring20160305beanid;

import org.springframework.beans.factory.BeanNameAware;

public class WangYang implements BeanNameAware{

	private String beanName;
	
	@Override
	public void setBeanName(String beanName) {
		this.beanName = beanName;
	}
	
	public void printBeanName(){
		System.out.println(this.beanName);
	}
}
プロファイルでBeanを構成します.


	  
	  
上記の説明をテストします.
package com.siti.spring20160305beanid;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.siti.spring20160227.Person;



public class MainTest {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext20160305.xml");
		WangYang wy = context.getBean("wangyang", WangYang.class);
		wy.printBeanName();
	}
}

ここでwyインスタンスのidを手に入れます.