aop配置文件 <?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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 匹配自动扫描的包 --> <context:component-scan base-package="com.neusoft.aop"></context:component-scan> <!-- 使得@AspectJ注解起作用:自动为匹配的类生成代理对象 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
业务类
package com.tiger.aop;
import org.springframework.stereotype.Component;
@Component
public class MathematicsCalculatorImpl implements MathematicsCalculator {
@Override
public int add(int i, int j) {
int result = i+j;
return result;
}
@Override
public int sub(int i, int j) {
int result = i-j;
return result;
}
@Override
public int mul(int i, int j) {
int result = i*j;
return result;
}
@Override
public int div(int i, int j) {
int result = i/j;
return result;
}
}
aop切面类
package com.tiger.aop;
import java.util.Arrays;
import java.util.List;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AspectJAOP {
/**
* 前置通知:目标方法执行前执行的通知
* @param joinpoint
*/
@Before("execution(* com.tiger.aop.MathematicsCalculatorImpl.*(.. ))")
public void beforeMethod(JoinPoint joinpoint){
String methodName = joinpoint.getSignature().getName();
List<Object> args = Arrays.asList(joinpoint.getArgs());
System.out.println("The "+methodName+" method start....."+args);
}
/**
* 后置通知:在目标方法执行后(无论是否发生异常),执行该通知
* 在后置通知中还不能访问目标方法执行的结果(方法可能会出异常,所以访问不到)
* @param joinpoint
*/
@After("execution(* com.tiger.aop.MathematicsCalculatorImpl.*(int , int ))")
public void afterMethod(JoinPoint joinpoint){
String methodName = joinpoint.getSignature().getName();
System.out.println("The "+methodName+" method end.....");
}
/**
* 方法正常结束后执行的代码
* 返回通知是可以访问到方法的返回值的
* @param joinpoint
*/
@AfterReturning(value="execution(* com.tiger.aop.MathematicsCalculatorImpl.*(int , int ))",
returning="result")
public void afterRuningMethod(JoinPoint joinpoint,Object result){
String methodName = joinpoint.getSignature().getName();
System.out.println("The "+methodName+" method end.....with.."+result);
}
/**
* 在目标方法出现异常时执行的代码
* 可以访问到异常对象,且可以指定在出现特定异常时再执行通知代码 (如NullPointException)
* @param joinpoint
* @param e
*/
@AfterThrowing(value="execution(* com.tiger.aop.MathematicsCalculatorImpl.*(int , int ))",
throwing="e")
public void afterThrowingMethod(JoinPoint joinpoint,Exception e){
String methodName = joinpoint.getSignature().getName();
System.out.println("The "+methodName+" method occurs exception.."+e);
}
/**
* 环绕通知需要带ProceedingJoinPoint类型的参数
* 环绕通知类似于动态代理的全过程,ProceedingJoinPoint类型的参数可以决定是否执行目标方法
* 且环绕通知必须有返回值,返回值就是目标方法的返回值
* @param pjp
* @return
*/
@Around("execution(* com.tiger.aop.MathematicsCalculatorImpl.*(int , int ))")
public Object aroundMethod(ProceedingJoinPoint pjp){
Object result =null;
String methodName = pjp.getSignature().getName();
try {
List<Object> args = Arrays.asList(pjp.getArgs());
//前置通知
System.out.println("The "+methodName+" method start....."+args);
//执行该方法
result = pjp.proceed();
//后置通知
System.out.println("The "+methodName+" method end.....with.."+result);
} catch (Throwable e) {
// TODO Auto-generated catch block
System.out.println("The "+methodName+" method occurs exception.."+e);
}
return result;
}
}
测试类
package com.tiger.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainAspectJ {
public static void main(String[] args) {
//1、创建springIOC容器
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext-aop.xml");
//2、从IOC容器中获取bean的实例
MathematicsCalculator mc = act.getBean(MathematicsCalculator.class);
//3、使用bean
int result = mc.add(2, 3);
System.out.println("result"+result);
result = mc.div(10, 5);
System.out.println("result"+result);
}
}