Spring攻略学习笔记(3.07)------为Bean引入行为 (二)

2014-11-24 11:19:57 · 作者: · 浏览: 3
arents(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;
}

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);
}
}