Springステップアップの道(6)-抽象BeanとファクトリBeanおよびBeanのidの取得
いくつかのクラスのパラメータの一部が重複している場合があります.これらの重複したパラメータにかかわらず、特にこれらのパラメータが多く、多くのbeanで使用されている場合、プロファイルが肥大化します.では、最も良い方法は、これらの重複したものを抽出して共通のモジュールに置くことです.では、私が必要とするときは、直接引用すればいいです.javaのクラスの継承のように、同じ部分を共通のモジュールに置くことができます.
抽象Bean
次に例を示します.
同様のWYクラスもこのインタフェースを実現した
プロファイルでは、abstract="true"という抽象Beanに設定します.これにより、参照を行うときに親Beanの情報をparent="*"で参照します.
テストコード
工場Bean
先のブログではファクトリについて言及しましたが、以前のファクトリはファクトリモードでしたが、今のところ特別なBeanではFactoryBeanインタフェースを実装し、そのメソッドを実装しなければなりません.プログラムがgetBeanでインスタンスを取得すると、実装されたメソッドのgetObjectメソッドの戻り値が返されます.
3つの方法:
1.getObject():Beanのインスタンスを返す
2.getobjectType():Beanによって生成されたjavaインスタンスの実装クラスを返します.
3.isSingleton():単一モードかどうか.
このクラスはFactoeyBeanインタフェースを実装し、以下のようにします.
テストコード:
BeanのIDを取得
場合によっては、Beanのidを事前に知る必要がある場合がありますが、次の例では、BeanNameAwareインタフェースを使用して、プロファイルで構成されているidを取得する方法を示します.
構成ファイルがBeanをインスタンス化している間に、クラスがBeanName Awareというインタフェースを実装していることが検出されると、setBeanNameメソッドでBeanのidがパラメータbeanNameとしてクラスのプロパティに注入されます.
BeanNameAwareインタフェースを実装し、その方法を実装します.
ここでwyインスタンスのidを手に入れます.
抽象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
プロファイル
テストコード:
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を手に入れます.