1、需要引用的jar包及xml文件规范,请查看上一篇:Spring整理系列(13)——基于配置方式实现spring AOP
2、基于Aspectj注解风格,xml配置
<!-- 开启aspectj风格自动代理 -->
<aop:aspectj-autoproxy/>
<!-- 注册登录业务bean -->
<bean name="loginService" class="com.test.spring.aop.LoginServiceImpl"></bean>
<!-- 注册登录业务日志切面bean -->
<bean name="loginLogAspect" class="com.test.spring.aop.LoginLogAspect"></bean>
3、用注解配置切面类(业务接口及其实现类同样查看上一篇)
package com.test.spring.aop;
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;
/**
* @Description: 登录业务日志的切面
* 添加@Aspect注解,标注该类为切面类
*/
@Aspect
public class LoginLogAspect {
//配置切入点,将连接点和通知联通起来
@Pointcut("execution(* com.test.spring.aop.*.*(..))")
public void loginPointcut(){}
//前置通知,可以直接配置切入点表达式
@Before("execution(* com.test.spring.aop.LoginServiceImpl.init(..))")
public void beforeLogin(JoinPoint point){
System.out.println("前置通知。。。");
}
//后置通知,引用切入点表达式方法
@After(value = "loginPointcut()")
public void afterLogin(){
System.out.println("后置通知。。。");
}
//环绕通知,有返回值,第一个参数必须是ProceedingJoinPoint类型
@Around("loginPointcut()")
public Object aroundLogin(ProceedingJoinPoint point) throws Throwable{
System.out.println("环绕通知,业务方法执行之前。。。");
Object obj = point.proceed();//向下执行业务方法
System.out.println("环绕通知,业务方法执行之后。。。");
return obj;
}
//返回后通知
@AfterReturning(value = "loginPointcut()")
public void afterReturningLogin(){
System.out.println("返回后通知。。。");
}
//抛出异常后通知
@AfterThrowing("loginPointcut()")
public void afterThrowingLogin(){
System.out.println("抛出异常后通知。。。");
}
}
关于注解风格的切入点表达式使用,可以查看:Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了)