解決springboot的aop切面不起作用問題(失效的排查)
阿新 • • 發佈:2020-04-27
檢查下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切面不起作用問題(失效的排查)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。