解决springboot的aop切面不起作用问题(失效的排查)

 更新时间:2020年04月26日 11:14:43   作者:pu.xiao.zhang  
这篇文章主要介绍了解决springboot的aop切面不起作用问题(失效的排查),具有很好的参考价值,希望对大家有所帮助。 一起跟随小编过来看看吧

检查下springboot的启动类是否开启扫描

@SpringBootApplication
@ComponentScan(basePackages = {"com.zhangpu.springboot"})

另外springboot默认开启的EnableAspectJAutoProxy为true

如果不放心可以增加:

@EnableAspectJAutoProxy(proxyTargetClass=true)

第二种可能:

没有导入 相关的jar

<dependency>
 <groupId>org.aspectj</groupId>
 <artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
 <groupId>org.aspectj</groupId>
 <artifactId>aspectjweaver</artifactId>
</dependency>

补充知识:Springboot aop 实现全局配置事务

1.springboot实现事务只需要 在头上加上@Transactional注解

@Transactional 默认只捕获RuntimeException.class

对Exception异常得需要 @Transactional(rollbackFor = {Exception.class}) 捕获回滚。

2.当项目特别大的时候,对所有的service 都加上事务 ,显得非常麻烦。可以通过aop 方式实现全局异常。

代码如下。

这样就能专注写业务逻辑然后注意一下方法名就行了,当然也可以用

source.addTransactionalMethod("*", txAttr_REQUIRED); 匹配所有方法,但是并不是所有的方法都需要事务的。所有推荐匹配方法名的方法

package com.example.demo.aop;

import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.TransactionInterceptor;

/**
 * @program: Druid
 * @description:
 * @author: ChenYu
 * @create: 2018-09-20 16:47
 **/
@Aspect
@Configuration
public class TransactionAdviceConfig {

 private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.example.demo.service.*.*(..))";

 @Autowired
 private PlatformTransactionManager transactionManager;

 @Bean
 public TransactionInterceptor txAdvice() {

  DefaultTransactionAttribute txAttr_REQUIRED = new DefaultTransactionAttribute();
  txAttr_REQUIRED.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

  DefaultTransactionAttribute txAttr_REQUIRED_READONLY = new DefaultTransactionAttribute();
  txAttr_REQUIRED_READONLY.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
  txAttr_REQUIRED_READONLY.setReadOnly(true);

  NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();

  source.addTransactionalMethod("save*", txAttr_REQUIRED);
  source.addTransactionalMethod("delete*", txAttr_REQUIRED);
  source.addTransactionalMethod("update*", txAttr_REQUIRED);
  source.addTransactionalMethod("exec*", txAttr_REQUIRED);
  source.addTransactionalMethod("set*", txAttr_REQUIRED);
  source.addTransactionalMethod("get*", txAttr_REQUIRED_READONLY);
  source.addTransactionalMethod("query*", txAttr_REQUIRED_READONLY);
  source.addTransactionalMethod("find*", txAttr_REQUIRED_READONLY);
  source.addTransactionalMethod("list*", txAttr_REQUIRED_READONLY);
  source.addTransactionalMethod("count*", txAttr_REQUIRED_READONLY);
  source.addTransactionalMethod("is*", txAttr_REQUIRED_READONLY);

  return new TransactionInterceptor(transactionManager, source);
 }

 @Bean
 public Advisor txAdviceAdvisor() {
  AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
  pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
  return new DefaultPointcutAdvisor(pointcut, txAdvice());
 }

}

以上这篇解决springboot的aop切面不起作用问题(失效的排查)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis 三表外关联查询的实现(用户、角色、权限)

    MyBatis 三表外关联查询的实现(用户、角色、权限)

    这篇文章主要介绍了MyBatis 三表外关联查询的实现(用户、角色、权限),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • JavaCV实现照片马赛克效果

    JavaCV实现照片马赛克效果

    这篇文章主要介绍了如何通过JavaCV实现照片马赛克效果,文中的示例代码讲解详细,对我们学习JavaCV有一定的帮助,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-01-01
  • SpringBoot多环境日志配置方式

    SpringBoot多环境日志配置方式

    SpringBoot 默认使用LogBack日志系统,默认情况下,SpringBoot项目的日志只会在控制台输入,本文给大家介绍SpringBoot多环境日志配置方式,需要的朋友可以参考下
    2024-08-08
  • Java获取文件的类型和扩展名的实现方法

    Java获取文件的类型和扩展名的实现方法

    这篇文章主要介绍了Java获取文件的类型和扩展名的实现方法的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java如何接收前端easyui datagrid传递的数组参数

    Java如何接收前端easyui datagrid传递的数组参数

    这篇文章分享一下怎么在easyui的datagrid刷新表格时,在后端java代码中接收datagrid传递的数组参数,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-11-11
  • Java中的CyclicBarrier循环栅栏详解

    Java中的CyclicBarrier循环栅栏详解

    这篇文章主要介绍了Java中的CyclicBarrier循环栅栏详解,CyclicBarrier循环栅栏是用来进行线程协作,等待线程满足某个计数,构造时设置计数个数,每个线程执行到某个需要“同步”的时刻调用 await()方法进行等待,当等待的线程数满足计数个数时,继续执行,需要的朋友可以参考下
    2023-12-12
  • log4j日志格式加入自定义字段信息方式

    log4j日志格式加入自定义字段信息方式

    这篇文章主要介绍了log4j日志格式加入自定义字段信息方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 使用String转换到Map结构

    使用String转换到Map结构

    这篇文章主要介绍了使用String转换到Map结构,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java增强for循环的实现方法

    java增强for循环的实现方法

    下面小编就为大家带来一篇java增强for循环的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • JDBC编程实现文件、图片的存储方法

    JDBC编程实现文件、图片的存储方法

    这篇文章主要介绍了JDBC编程实现文件、图片的存储方法,以实例形式分析了Java基于JDBC操作数据库的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10

最新评论