1. 程式人生 > 程式設計 >解決springboot的aop切面不起作用問題(失效的排查)

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