图解
依赖
Spring版本高的话要的aop依赖包也要高
<!-- aop依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
SpringAOP声明式事务管理
要添加命名空间
<!-- 配置事务管理器(抽取公共横切性关注点,模块化形成切面) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务通知,哪些方法需要开事务,通知可以理解为模块化类(切面类)中的方法 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"></tx:method>
<tx:method name="*" isolation="DEFAULT"></tx:method>
</tx:attributes>
</tx:advice>
<!-- 配置aop增强 -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.edu.guet.service.impl.*ServiceImpl.*(..))"></aop:advisor>
</aop:config>
注解方式实现
package cn.edu.guet.aop;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
/**
* @author pangjian
* @ClassName LogAspect
* @Description 日志切面
* 切入点和通知的抽象
* 1. 定义切入点 和 通知
* 3. 定义拦截以后方法要做什么事情
* @date 2021/7/15 20:10
*/
@Component // 将对象交给IOC容器进行实例化
@Aspect // 声明当前类是一个切面
public class LogAspect {
/**
* @Description:切入点,根据匹配规则(表达式)定义要拦截哪些类的哪些方法
* * cn.edu.guet.service.impl.*.*(..)
* 第一个 * 表示方法的修饰范围(public,private,protected),代表三者都包括了
* 第二个 * 表示cn.edu.guet.service.impl包下的所有类
* 第三个 * 表示类中的所有方法
* (..)表示方法参数
*
* @return void
* @date 2021/7/15 20:15
*/
@Pointcut("execution(* cn.edu.guet.service.impl.*ServiceImpl.*(..))")
public void pointCut(){
}
/**
* @Description:声明一个前置通知,并作用于切入点上
* @return void
* @date 2021/7/15 20:25
*/
@Before(value = "pointCut()")
public void before(){
System.out.println("前置通知");
}
/**
* @Description:方法有无异常执行后,都会执行通知
* @return void
* @date 2021/7/15 20:29
*/
@After(value = "pointCut()")
public void after(){
System.out.println("后置通知");
}
/**
* @Description:目标类方法在无异常执行后,执行通知
* @return void
* @date 2021/7/15 20:29
*/
@AfterReturning(value = "pointCut()")
public void afterReturn(){
System.out.println("返回通知");
}
/**
* @Description:遇到异常时,执行通知
* @return void
* @date 2021/7/15 20:33
*/
@AfterThrowing(value = "pointCut()")
public void afterThrow(){
System.out.println("异常通知");
}
}