1、xml中增加AspectJ配置
<aop:aspectj-autoproxy/>
2、下载aspectjweaver.jar
2、注解@Aspect注解表示被修饰的类为一个切面类。@Aspect注解不能通过类路径自动检测发现,需要配合使用@Component或者在xml文件中配置bean。
@PointCut注解用于修饰方法,表示切入点。可以通过&&,||和!等符号,对切入点表达式进行逻辑上的组合,从而形成复杂的表达式。
@Before注解用于修饰方法,表示before advice。
@AfterReturning注解用于修饰方法,表示正常返回通知。可以通过指定returning字段,获得连接点的返回值。
@AfterThrowing注解用于修饰方法,表示异常返回通知。可以通过指定throwing字段,获得连接点中的异常。
@After注解用于修饰方法,表示后置通知,需要准备处理正常和异常两种返回情况,通常用于释放资源。
@Around注解用于修饰方法,表示环绕通知,方法的第一个参数必须是ProceedingJoinPoint类型。在方法中,执行该类型对象的proceed方法,得到结果并进行return。
3、程序示例@Aspect
@Component
public class AspectJDemo
{
// 定义切入点
@Pointcut("execution(* learn.service.LearnServiceImpl.get*(..))")
public void pointCut1()
{}
// 定义切入点
@Pointcut("execution(* learn.service.LearnServiceImpl.learn(..))")
public void pointCut2()
{}
// 定义前置通知
@Before("pointCut2()")
public void before()
{
System.out.println("AspectJDemo|before");
}
}
// 定义正常返回后通知
@AfterReturning(pointcut = "pointCut1()", returning = "result")
public void afterReturning(Object result)
{
System.out.println("AspectJDemo|afterReturning");
System.out.println(result.toString());
}
// 定义异常返回后通知
@AfterThrowing(pointcut = "pointCut1()", throwing = "e")
public void afterThrowing(RuntimeException e)
{
System.out.println("AspectJDemo|afterThrowing");
System.out.println(e.getMessage());
}
// 定义后置通知
@After("pointCut1()")
public void after()
{
System.out.println("AspectJDemo|after");
}
//定义环绕通知
@Around("pointCut1()")
public Object around(ProceedingJoinPoint pjp) throws Throwable
{
System.out.println("around,before");
Object result = pjp.proceed();
System.out.println("around,after");
System.out.println("around,result is "+ result.toString());
return result;
}
//定义带参数的前置通知
@Before("pointCut1() && args(ddddd)")
public void beforeWithParam(String ddddd)
{
System.out.println("beforeWithParam| in advice :"+ ddddd);
}
热门评论
赞赞赞赞赞赞赞赞赞赞赞赞
写的真好 赞赞赞