如何排查并解决Spring Boot AOP切面失效的问题?

2026-05-26 09:171阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计587个文字,预计阅读时间需要3分钟。

如何排查并解决Spring Boot AOP切面失效的问题?

检查Spring Boot启动类是否开启了扫描,需要检查以下注解:

- @SpringBootApplication- @ComponentScan(basePackages={com.zhangpu.springboot})- 以及Spring Boot默认开启的@EnableAspectJAutoProxy(值为true)

如果不放心,还可以添加@EnableAspectJAut。

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

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

如何排查并解决Spring Boot AOP切面失效的问题?

另外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切面不起作用问题(失效的排查)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

本文共计587个文字,预计阅读时间需要3分钟。

如何排查并解决Spring Boot AOP切面失效的问题?

检查Spring Boot启动类是否开启了扫描,需要检查以下注解:

- @SpringBootApplication- @ComponentScan(basePackages={com.zhangpu.springboot})- 以及Spring Boot默认开启的@EnableAspectJAutoProxy(值为true)

如果不放心,还可以添加@EnableAspectJAut。

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

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

如何排查并解决Spring Boot AOP切面失效的问题?

另外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切面不起作用问题(失效的排查)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。