《Spring Recipes》第三章笔记6:Introducing Behaviors to...

《Spring Recipes》第三章笔记6:Introducing Behaviors to Your Beans


问题

有时候,可能会构建一组具有共同属性的Classes。在面向对象中,可以通过继承父类或者实现接口来实现。在AOP中,也可以通过类似的方式实现。在Java中,只能单继承,而通过AOP可以实现类似于多重继承的效果。

解决方案


使用通过@DeclareParents注解定义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、想要编写ArithmeticCalculatorImpl,实现max()和min()方法,由于Java只能单继承,所以使用常规方法只能继承MaxCalculatorImpl或者MinCalculatorImpl,无论是继承那一个类,没有同时继承好。
     使用Introduction,可以让ArithmeticCalculatorImpl同时继承MaxCalculatorImpl和MinCalculatorImpl来同时实现MaxCalculator和MinCalculator接口。

使用Introduction通知,和使用其他通知一样,需要定义一个切面,并使用@DeclareParents注解指定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属性指定了target是哪个类,defaultImpl属性指定了默认实现。
注意:value的值是类的完全限定名的字符串,defaultImpl是Class类型。

4、在配置文件中将上面定义的切面进行注册。
<beans ...>
... ...
    <bean class="com.apress.springrecipes.calculator.CalculatorIntroduction" />
</beans>

5、通过容器获取ArithmeticCalculatorImpl实例,可以将实例转换为MaxCalculator类型进行使用,也可以转换为MinCalculator类型进行使用。
ArithmeticCalculator arithmeticCalculator =
(ArithmeticCalculator) context.getBean("arithmeticCalculator");
... ...
MaxCalculator maxCalculator = (MaxCalculator) arithmeticCalculator;
maxCalculator.max(1, 2);
MinCalculator minCalculator = (MinCalculator) arithmeticCalculator;
minCalculator.min(1, 2);







你可能感兴趣的:(spring)