『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:
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);