『Spring Recipes』第三章ノート6:Introducing Behaviors to…
2787 ワード
『Spring Recipes』第三章ノート6:Introducing Behaviors to Your Bens
問題
共通の属性を持つクラスを構築する場合があります。オブジェクト指向では、親クラスの継承またはインターフェースの実現により実現できます。AOPにおいても同様の方法で実現できる。Javaでは、単独でしか継承できませんが、AOPを通じて、複数の継承に似た効果が得られます。
ソリューション
@Declare Partents注釈によりIntroductionを定義するという特殊な通知を用いて、インターフェースを動的に実現することができる。
例:
1、二つのインターフェースMaxCalculatorとMinCalculatorを編纂し、それぞれmax()とmin()の二つの方法を含む。
MaxCalculator:
MaxCalculatorimpl:
Introductionを使用して、MaxCalculatoImplとMinCalculatorimplを同時に引き継ぎ、MaxCalculatorインターフェースを実現します。
Introduction通知を使用する場合は、他の通知を使用する場合と同様に、切断面を定義し、@DeclareParts注を使用してtarget objectとデフォルト実装を指定する必要があります。
注意:valueの値はクラスの完全な限定名の文字列で、defaultImplはクラスタイプです。
4、配置ファイルに上記で定義されたうどんを登録する。
問題
共通の属性を持つクラスを構築する場合があります。オブジェクト指向では、親クラスの継承またはインターフェースの実現により実現できます。AOPにおいても同様の方法で実現できる。Javaでは、単独でしか継承できませんが、AOPを通じて、複数の継承に似た効果が得られます。
ソリューション
@Declare Partents注釈によりIntroductionを定義するという特殊な通知を用いて、インターフェースを動的に実現することができる。
例:
1、二つのインターフェースMaxCalculatorとMinCalculatorを編纂し、それぞれmax()とmin()の二つの方法を含む。
MaxCalculator:
public interface MaxCalculator {
public double max(double a, double b);
}
MinCalculator:public interface MinCalculator {
public double min(double a, double b);
}
2、以上の二つのインターフェースを実現する:MaxCalculatorimpl:
public class MaxCalculatorImpl implements MaxCalculator {
public double max(double a, double b) {
double result = (a >= b) ? a : b;
System.out.println("max(" + a + ", " + b + ") = " + result);
return result;
}
}
MinCalculatorimpl:public class MinCalculatorImpl implements MinCalculator {
public double min(double a, double b) {
double result = (a <= b) ? a : b;
System.out.println("min(" + a + ", " + b + ") = " + result);
return result;
}
}
3、ArthmeticCalculatoImplを作成し、max()とmin()の方法を実現するには、Javaは単に継承するしかないので、従来の方法ではMaxCalculatoImplまたはMinCalculatorimplを継承するしかないです。Introductionを使用して、MaxCalculatoImplとMinCalculatorimplを同時に引き継ぎ、MaxCalculatorインターフェースを実現します。
Introduction通知を使用する場合は、他の通知を使用する場合と同様に、切断面を定義し、@DeclareParts注を使用してtarget objectとデフォルト実装を指定する必要があります。
@Aspect
public class CalculatorIntroduction {
@DeclareParents(value = "com.apress.springrecipes.calculator.ArithmeticCalculatorImpl",
defaultImpl = MaxCalculatorImpl.class)
public MaxCalculator maxCalculator;
@DeclareParents(value = "com.apress.springrecipes.calculator.ArithmeticCalculatorImpl",
defaultImpl = MinCalculatorImpl.class)
public MinCalculator minCalculator;
}
value属性はどのクラスかを指定しています。defaultImpl属性はデフォルト実装を指定しています。注意:valueの値はクラスの完全な限定名の文字列で、defaultImplはクラスタイプです。
4、配置ファイルに上記で定義されたうどんを登録する。
<beans ...>
... ...
<bean class="com.apress.springrecipes.calculator.CalculatorIntroduction" />
</beans>
5、容器からアルティメットの例を取得することにより、インスタンスをMaxCalculatorタイプに変換して使用することができ、またMinCalculatorタイプに変換して使用することもできる。ArithmeticCalculator arithmeticCalculator =
(ArithmeticCalculator) context.getBean("arithmeticCalculator");
... ...
MaxCalculator maxCalculator = (MaxCalculator) arithmeticCalculator;
maxCalculator.max(1, 2);
MinCalculator minCalculator = (MinCalculator) arithmeticCalculator;
minCalculator.min(1, 2);