只需两步:java
一、引入 支持aop xml头,添加本身类:web
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>
二、添加本身的 aop类,用注解来 切面 ,拦截。spring
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配置 也说一下吧)sql
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.7.1</version> </dependency>
这是我引入的包,检查下本身是否引入。api