Spring攻略学习笔记(3.01)------在Spring中启用AspectJ注解支持
一、知识点
Spring支持在其AOP框架中使用AspectJ注解编写POJO aspect。但是,必须先在Spring IoC容器中启 用AspecJ注解支持。
只需要在Bean配置文件中定义一个空的XML元素<aop:aspectj-autoproxy>就可以启用Spring IoC容器中AspectJ注解支持。然后,Spring将自动为匹配你的AspectJ aspect的 所有Bean创建代理。
对于接口不可用或者没有用于应用程序设计中的情况,可以依靠CGLIB创建代理。为了启用 CGLIB创建代理,必须在<aop:aspectj-autoproxy>中设置 proxy-targetclass= true 属性。
二、代码示例计算器接口
package com.codeproject.jackie.springrecipesnote.springaop;
/**
* 加减乘除
* @author jackie
*
*/
public interface ArithmeticCalculator {
/**
* 加
* @param a
* @param b
* @return
*/
public double add(double a, double b);
/**
* 减
* @param a
* @param b
* @return
*/
public double sub(double a, double b);
/**
* 乘
* @param a
* @param b
* @return
*/
public double mul(double a, double b);
/**
* 除
* @param a
* @param b
* @return
*/
public double div(double a, double b);
}
package com.codeproject.jackie.springrecipesnote.springaop;
/**
* 单位转换
* @author jackie
*
*/
public interface UnitCalculator {
/**
* 千克(或公斤)转换成磅
* @param kilogram
* @return
*/
public double kilogramToPound(double kilogram);
/**
* 千米转换成英里
* @param kilometer
* @return
*/
public double kilometerToMile(double kilometer);
}
相应的实现类 package com.codeproject.jackie.springrecipesnote.springaop;
/**
* 加减乘除实现类
* @author jackie
*
*/
public class ArithmeticCalculatorlmpl implements ArithmeticCalculator {
public double add(double a, double b) {
double result = a + b;
System.out.println(a + " + " + b + " = " + result);
return result;
}
public double sub(double a, double b) {
double result = a - b;
System.out.println(a + " - " + b + " = " + result);
return result;
}
public double mul(double a, double b) {
double result = a * b;
System.out.println(a + " * " + b + " = " + result);
return result;
}
public double div(double a, double b) {
if (b == 0) {
throw new IllegalArgumentException("Division by zero");
}
double result = a / b;
System.out.println(a + " / " + b + " = " + result);
return result;
}
}
package com.codeproject.jackie.springrecipesnote.springaop;
/**
* 单位转换实现类
* @author jackie
*
*/
public class UnitCalculatorImpl implements UnitCalculator {
public double kilogramToPound(double kilogram) {
double pound = kilogram * 2.2;
System.out.println(kilogram + " kilogram = " + pound + " pound");
return pound;
}
public double kilometerToMile(double kilometer) {
double mile = kilometer * 0.62;
System.out.println(kilometer + " kilometer = " + mile + " mile");
return mile;
}
}
为了启用这个应用的AspectJ注解支持,你只要在Bean配置文件中定义一个空的XML元素<aop:aspectj-autoproxy>。而且,你必须将aop schema定义添加到<beans>根元素下。当Spring IoC容器发现Bean配置文件中的<aop:aspectj-autoproxy>元素,它将自动为匹配AspecJ aspect的Bean创建代理。
注:如果使用Maven管理依赖,需添加以下依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.2</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"> <aop:aspectj-autoproxy /> <bean id="arithmeticCalculator" class="com.codeproject.jackie.springrecipesnote.springaop.ArithmeticCalculatorlmpl" /> <bean id="unitCalculator" class="com.codeproject.jackie.springrecipesnote.springaop.UnitCalculatorImpl" /> </beans>
测试方法
@Test
public void testAop() {
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);
UnitCalculator unitCalculator = (UnitCalculator) applicationContext.getBean("unitCalculator");
unitCalculator.kilogramToPound(100);
unitCalculator.kilometerToMile(100);
}

浙公网安备 33010602011771号