只需两步:
1、引入 支持aop xml头,添加自己类:
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
...
...
<!-- 启动AspectJ支持 -->
<aop:aspectj-autoproxy />
<bean id="aspectJAdvice" class="com.util.aop.AspectAdvice"></bean>
2、添加自己的 aop类,用注解来 切面 ,拦截。
package com.util.aop;
import java.sql.SQLException;
import java.util.Date;
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 com.util.webapi.DBUtils;
/***
* spring AOP 切面 自动控制事务
*
* @author 姚林涛
* 2017-9-22
*/
@Aspect
public class AspectAdvice {
/**
* Pointcut 定义Pointcut,Pointcut的名称为aspectjMethod(),此方法没有返回值和参数
* 该方法就是一个标识,不进行调用
*/ //execution(* *(..))
@Pointcut("execution(* com.service..*.*(..))")
private void aspectjMethod() {
};
// 自定义After
//@After("execution(* add*(..))")
public void doSava(JoinPoint joinPoint) {
System.out.println("-----------@After这是日志:新增用户成功---" + new Date());
}
/**
* Before 在核心业务执行前执行,不能阻止核心业务的调用。
*
* @param joinPoint
* @throws SQLException
*/
@Before("aspectjMethod()")
public void doBefore(JoinPoint joinPoint) throws SQLException {
DBUtils.openConn();
System.out.println("-----@Before-----");
// System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等");
// System.out.println(" 可通过joinPoint来获取所需要的内容");
// System.out.println("-----End of doBefore()------");
}
/**
* Around 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
*
* 注意:当核心业务抛异常后,立即退出,转向AfterAdvice 执行完AfterAdvice,再转到ThrowingAdvice
*
* @param pjp
* @return
* @throws Throwable
*/
//@Around(value = "aspectjMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("-----doingBefor-----");
// 调用核心逻辑
Object retVal = pjp.proceed();
System.out.println("-----doingAfter-----");
return retVal;
}
/**
* After 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice
*
* @param joinPoint
* @throws SQLException
*/
@After(value = "aspectjMethod()")
public void doAfter(JoinPoint joinPoint) throws SQLException {
DBUtils.commit();
DBUtils.closeConnection();
System.out.println("-----@After-----");
// System.out.println(" 此处意在执行核心业务逻辑之后,做一些日志记录操作等等");
// System.out.println(" 可通过joinPoint来获取所需要的内容");
// System.out.println("-----End of doAfter()------");
}
/**
* AfterReturning 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice
*
* @param joinPoint
*/
//@AfterReturning(value = "aspectjMethod()", returning = "retVal")
public void doReturn(JoinPoint joinPoint, String retVal) {
System.out.println("-----@AfterReturning-----");
// System.out.println("Return Value: " + retVal);
// System.out.println(" 此处可以对返回值做进一步处理");
// System.out.println(" 可通过joinPoint来获取所需要的内容");
// System.out.println("-----End of doReturn()------");
}
/**
* 核心业务逻辑调用异常退出后,执行此Advice,处理错误信息
*
* 注意:执行顺序在Around Advice之后
*
* @param joinPoint
* @param ex
* @throws SQLException
*/
@AfterThrowing(value = "aspectjMethod()", throwing = "ex")
public void doThrowing(JoinPoint joinPoint, Exception ex) throws SQLException {
DBUtils.rollback();
System.out.println("-----AOP Print: Exception :-----");
ex.printStackTrace();
//执行后 交给 spring 异常处理器 处理返回参数 -MyExceptionHandler
}
}
跑起来 走两步 即可。(注意Jar包 pom.xml配置 也说一下吧)
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.1</version>
</dependency>
这是我引入的包,检查下自己是否引入。