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

网友投稿 1607 2023-06-09

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

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

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

@SpringBootApplication

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

另外springboot默认开启的EnableAspectJAutoProxy为true

如果不放心可以增加:

@EnableAspectJAutoProxy(proxyTargetClass=true)

第二种可能:

没有导入 相关的jar

org.aspectj

aspectjrt

org.aspectj

aspectjweaver

补充知识: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.sprhttp://ingframework.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());

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决没有@RunWith 和 @SpringBootTest注解或失效问题
下一篇:Springboot使用Junit测试没有插入数据的原因
相关文章

 发表评论

暂时没有评论,来抢沙发吧~