applicationContext.xml
<!-- 配置扫描组件包 【com.sprdatajpa**】,通过注解定义bean, 默认同时也通过注解自动注入 -->
<context:component-scan base-package="com.sprdatajpa"/>
<!-- 启用@AspectJ风格的切面声明 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
MyAspect.java
package com.sprdatajpa.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author kingly
* @date 2015年6月7日
* 使用AspectJ风格的切面声明测试
*
*/
@Component
@Aspect
public class MyAspect {
/**
* 声明一个切入点(包括切入点表达式和切入点签名)
*/
@Pointcut("execution(* com.sprdatajpa.service..*.*(..))")
public void pointcut1(){}
/**
* 声明一个前置通知
*/
@Before(value="pointcut1()")
public void beforeAdvide(JoinPoint point) {
System.out.println("触发了前置通知!");
System.out.println(point.getTarget()); //获取被代理对象[service对象]
Object[] args = point.getArgs(); //获取被代理对象方法的传入参数[service对象方法的传入参数]
for (Object arg : args) {
System.out.println(arg);
}
}
/**
* 声明一个后置通知
*/
@After(value="pointcut1()")
public void afterAdvice(JoinPoint point) {
System.out.println("触发了后置通知,抛出异常也会被触发!");
}
/**
* 声明一个返回后通知
*/
@AfterReturning(value="pointcut1()", returning="ret")
public void afterReturningAdvice(JoinPoint point, Object ret) {
System.out.println("触发了返回后通知,抛出异常时不被触发,返回值为:" + ret);
}
/**
* 声明一个异常通知
*/
@AfterThrowing(pointcut="pointcut1()", throwing="throwing")
public void afterThrowsAdvice(JoinPoint point, RuntimeException throwing){
System.out.println("触发了异常通知,抛出了RuntimeException异常!");
System.out.println("异常堆栈信息如下:");
throwing.printStackTrace();
}
/**
* 声明一个环绕通知
* 不管是其前置和后置通知,总是最先执行,异常抛出后后置通知不再执行
*/
@Around(value="pointcut1()")
public Object aroundAdvice(ProceedingJoinPoint point) throws Throwable {
System.out.println("触发了环绕通知的开始~~~");
Object o = point.proceed();
System.out.println("触发了环绕通知的结束~~~");
return o; //经过加工的对象
}
}