public MaxCalculator maxCalculator;
@DeclareParents(value = "com.codeproject.jackie.springrecipesnote.springaop.ArithmeticCalculatorlmpl", defaultImpl = MinCalculatorImpl.class)
public MinCalculator minCalculator;
}
package com.codeproject.jackie.springrecipesnote.springaop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;
/**
* @author jackie
*
*/
@Aspect
public class CalculatorIntroduction {
@DeclareParents(value = "com.codeproject.jackie.springrecipesnote.springaop.ArithmeticCalculatorlmpl", defaultImpl = MaxCalculatorImpl.class)
public MaxCalculator maxCalculator;
@DeclareParents(value = "com.codeproject.jackie.springrecipesnote.springaop.ArithmeticCalculatorlmpl", defaultImpl = MinCalculatorImpl.class)
public MinCalculator minCalculator;
}
@DeclareParents注解的value属性表示引入的目标类。引入的接口由被注解的字段类型确定。最后,用于新接口的实现类在defaultlmpl属性中指定。
通过这两个引入,你可以动态地为ArithmeticCalculatorlmpl类引入两个接口。实际上,可以在@DeclareParents注解的value属性中指定一个AspectJ类型匹配表达式,将一个接口引入多个类。最后需要在应用上下文中声明这个aspect的一个实例。
[html]
测试类
[java] package com.codeproject.jackie.springrecipesnote.springaop;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author jackie
*
*/
public class IntroductionTest {
@Test
public void testIntroduction() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator)applicationContext.getBean("arithmeticCalculator");
arithmeticCalculator.add(1, 2);
arithmeticCalculator.sub(1, 2);
arithmeticCalculator.mul(1, 2);
arithmeticCalculator.div(1, 2);
MaxCalculator maxCalculator = (MaxCalculator) arithmeticCalculator;
maxCalculator.max(1, 2);
MinCalculator minCalculator = (MinCalculator) arithmeticCalculator;
minCalculator.min(1, 2);
}
}
package com.codeproject.jackie.springrecipesnote.springaop;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author jackie
*
*/
public class IntroductionTest {
@Test
public void testIntroduction() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator)applicationContext.getBean("arithmeticCalculator");
arithmeticCalculator.add(1, 2);
arithmeticCalculator.sub(1, 2);
arithmeticCalculator.mul(1, 2);
arithmeticCalculator.div(1, 2);
MaxCalculator maxCalculator = (MaxCalculator) arithmeticCalculator;
maxCalculator.max(1, 2);
MinCalculator minCalculator = (MinCalculator) arithmeticCalculator;
minCalculator.min(1, 2);
}
}