Aspect注解的使用,实现aop事务

本文介绍了如何在Spring框架中利用@Aspect注解进行AOP事务管理。详细阐述了从设置事务工具类,创建切面类,定义被监听的方法到执行事务操作的整个流程,特别指出在使用@AfterReturning和@Around注解时,应注意 Around 注解返回结果对AfterReturning的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Aspect的使用

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

项目结构 

@Component
public class User {

    public String add(String message) {
        System.out.println("执行User添加方法:" + message);
        return "add:" + message;
    }

    public int addNum(String message, int num) {
        System.out.println("执行User添加方法:" + message + ",编号:" + num);
        return num + 5;
    }
}

 AfterReturning是在Around后面调用,如果同时使用这两个注解,Around需要返回结果,否则AfterReturning拿不到返回参数

@Component
@Aspect
public class AopSpringAspect {

    // // 异常通知
    @AfterThrowing("execution(* com.stude.freemarker.aspect.server.User.*(..))")
    public void afterThrowing() {
        System.out.println("任务执行异常");
    }

    // 环绕通知
    @Around("execution(* com.stude.freemarker.aspect.server.User.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕执行任务前");
        Object rvt = proceedingJoinPoint.proceed();
        System.out.println("环绕执行任务后: " + new Gson().toJson(rvt));
        return rvt;
    }

    @Before("within(com.stude.freemarker.aspect.server.*)")
    public void before(JoinPoint joinPoint){
        Object args[] = joinPoint.getArgs();
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("传入参数" + method.getDeclaringClass().getName());
        System.out.println("传入参数" + method.getName());
        System.out.println("传入参数" + new Gson().toJson(args));
    }

    @AfterReturning(value = "within(com.stude.freemarker.aspect.server.*)",returning = "rvt")
    public void after(JoinPoint joinPoint,Object rvt){
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("返回参数" + method.getDeclaringClass().getName());
        System.out.println("返回参数" + method.getName());
        System.out.println("返回参数" + new Gson().toJson(rvt));
    }
}

 

@EnableAsync
@SpringBootApplication
public class AsyncApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(AsyncApplication.class, args);
        User myconf = (User) context.getBean("user");
        myconf.add("test001");
        int name = myconf.addNum("002",02);
        System.out.println("ss");
    }
}

1.事务工具类 

/**
 * Created on 2019/4/6.
 *
 * @author Grak
 * @since 1.0
 */
@Component
public class TransactionUtils {

    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;

    // 开启事务
    public TransactionStatus begin() {
        TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
        return transaction;
    }

    // 提交事务
    public void commit(TransactionStatus transactionStatus) {
        dataSourceTransactionManager.commit(transactionStatus);
    }

    // 回滚事务
    public void rollback(TransactionStatus transactionStatus) {
        dataSourceTransactionManager.rollback(transactionStatus);
    }
}

2、添加切面类

/**
 * Created on 2019/4/6.
 *
 * @author Grak
 * @since 1.0
 */
@Component
@Aspect
public class AopSpringAspect {

    @Autowired
    private TransactionUtils transactionUtils;

    // // 异常通知
    @AfterThrowing("execution(* com.stude.aop.aspect.jdbcaspect.DemoAspect.runAspect(..))")
    public void afterThrowing() {
        System.out.println("程序已经回滚");
        // 获取程序当前事务 进行回滚
        transactionUtils.rollback(TransactionAspectSupport.currentTransactionStatus());
//        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }

    // 环绕通知
    @Around("execution(* com.stude.aop.aspect.jdbcaspect.DemoAspect.runAspect(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("开启事务");
        TransactionStatus begin = transactionUtils.begin();
        proceedingJoinPoint.proceed();
        transactionUtils.commit(begin);
        System.out.println("提交事务");
    }
}

3、被监听方法

/**
 * Created on 2019/4/5.
 *
 * @author Grak
 * @since 1.0
 */
@Component
public class User {

    public void add(String message) {
        System.out.println("执行User添加方法:" + message);
    }

    public void addNum(String message, int num) {
        System.out.println("执行User添加方法:" + message + ",编号:" + num);
    }
}

4、执行方法

@SpringBootApplication
public class AopApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(AopApplication.class, args);

        //AopAspect执行
        User myconf = (User) ctx.getBean("user");
        myconf.add("test001");

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值