网上搜了半天,spring boot整合aop的方法大致分为两种。
第一种通过@EnableTransactionManagement和@Transactional两个注解控制事物,这个比较简单,但是每一个方法上都要加注解,可以对每个方法精细控制。
第二种是写一个切面类在切面类中对一类方法进行事物的控制。
第一种比较简单,直接在类上加注解就可以了,十分简单,也没什么可讲的,这里我们仔细讲一下第二种。
首先引入jar包,我这里用了maven
<!-- aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
然后编写切面类
@Aspect
@Configuration
public class WebLogAspect {
private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.zhirong.*.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);
DefaultTransactionAttribute txAttr_REQUIRED_EXCEPTION= new DefaultTransactionAttribute();
txAttr_REQUIRED_EXCEPTION.rollbackOn(new Exception());
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
source.addTransactionalMethod("update*", txAttr_REQUIRED);
source.addTransactionalMethod("add*", txAttr_REQUIRED);
source.addTransactionalMethod("get*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("query*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("find*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("load*", txAttr_REQUIRED_READONLY);
source.addTransactionalMethod("*",txAttr_REQUIRED_EXCEPTION);
return new TransactionInterceptor(transactionManager, source);
}
@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
}
new出来的DefaultTransactionAttribute 可以设置很多属性,这个与xml中的配置差不多,这里就不多赘述。