Spring Beanの設定継承
Springでは、Beanの共通の値、プロパティ、または設定を共有するためにBeanの設定で継承がサポートされています。
子Beanまたは継承されたBeanは、親Beanの設定、プロパティ、およびいくつかの属性を継承できます。さらに、子Beanは継承された値をオーバーライドすることができます。
Beanの設定継承がSpringでどのように機能するかを示すために、以下の完全な例を参照してください。
package com.mkyong.common;
public class Customer {
private int type;
private String action;
private String Country;
//...
}
Bean設定ファイル
<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-2.5.xsd">
<bean id="BaseCustomerMalaysia" class="com.mkyong.common.Customer">
<property name="country" value="Malaysia"/>
</bean>
<bean id="CustomerBean" parent="BaseCustomerMalaysia">
<property name="action" value="buy"/>
<property name="type" value="1"/>
</bean>
</beans>
上記の ‘BaseCustomerMalaysia’ Beanにはcountryプロパティの ‘Malaysia’値が含まれており、 ‘CustomerBean’ Beanはこの値をその親( ‘BaseCustomerMalaysia’)から継承しています。
それを実行します
package com.mkyong.common;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App
{
public static void main( String[]args )
{
ApplicationContext context =
new ClassPathXmlApplicationContext("SpringBeans.xml");
Customer cust = (Customer)context.getBean("CustomerBean");
System.out.println(cust);
}
}
出力
Customer[type=1, action=buy, Country=Malaysia].... 'CustomerBean' beanは、その親( 'BaseCustomerMalaysia')からcountryプロパティを継承しました。 === 抽象的な継承 上記の例では、 'BaseCustomerMalaysia'はまだインスタンス化することができます。たとえば、
Customer cust = (Customer)context.getBean("BaseCustomerMalaysia");
この基本Beanをテンプレートとして作成し、他のインスタンスのインスタンス化を許可しない場合は、<bean>要素に '** abstract ** '属性を追加できます。例えば
<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-2.5.xsd”>
;
<bean id="BaseCustomerMalaysia" class="com.mkyong.common.Customer" abstract="true">
<property name="country" value="Malaysia"/>
</bean>
<bean id="CustomerBean" parent="BaseCustomerMalaysia">
<property name="action" value="buy"/>
<property name="type" value="1"/>
</bean>
</beans>
ここで、 'BaseCustomerMalaysia' Beanは純粋なテンプレートであり、Beanはインスタンスをインスタンス化しようとすると次のエラーメッセージが表示されます。
Customer cust = (Customer)context.getBean("BaseCustomerMalaysia");
org.springframework.beans.factory.BeanIsAbstractException:
Error creating bean with name ‘BaseCustomerMalaysia’:
Bean definition is abstract
=== 純粋な継承テンプレート 実際には、親Beanはクラス属性を定義する必要はありません。多くの場合、共有のために共通のプロパティが必要な場合があります。ここに例があります
<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-2.5.xsd”>
;
<bean id="BaseCustomerMalaysia" abstract="true">
<property name="country" value="Malaysia"/>
</bean>
<bean id="CustomerBean" parent="BaseCustomerMalaysia"
class="com.mkyong.common.Customer">
<property name="action" value="buy"/>
<property name="type" value="1"/>
</bean>
</beans>
この場合、 'BaseCustomerMalaysia' Beanは純粋なテンプレートであり、 'country'プロパティのみを共有します。 === それを上書きする ただし、子Beanに新しい値を指定することによって継承された値をオーバーライドすることはできます。この例を見てみましょう
<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-2.5.xsd”>
;
<bean id="BaseCustomerMalaysia" class="com.mkyong.common.Customer" abstract="true">
<property name="country" value="Malaysia"/>
</bean>
<bean id="CustomerBean" parent="BaseCustomerMalaysia">
<property name="country" value="Japan"/>
<property name="action" value="buy"/>
<property name="type" value="1"/>
</bean>
</beans>
'CustomerBean' beanは、 'Malaysia'から 'Japan'への親( 'BaseCustomerMalaysia')の国のプロパティをオーバーライドします。
Customer[Country=Japan, action=buy, type=1]….
結論
Spring Beanの設定継承は、複数のBeanの共通の値や設定の繰り返しを避けるために非常に便利です。
ソースコードをダウンロードする
ダウンロードする – リンク://wp-content/uploads/2010/03/Spring-Bean-Inheritance-Example.zip[Spring-Bean-Inheritance-Example.zip](5 KB)