Spring系列第50篇:spring事务拦截器顺序如何控制?

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

DROP DATABASE IF EXISTS javacode2018;

CREATE DATABASE if NOT EXISTS javacode2018;

USE javacode2018;

DROP TABLE IF EXISTS t_user;

CREATE TABLE t_user(

id int PRIMARY KEY AUTO_INCREMENT,

name varchar(256) NOT NULL DEFAULT ‘’ COMMENT ‘姓名’

);

3.2、Spring配置类MainConfig10

@1:开启了事务管理功能,并且设置了事务拦截器的顺序是2,spring事务拦截器完整类名是

org.springframework.transaction.interceptor.TransactionInterceptor

@2:开启aop功能

package com.javacode2018.tx.demo10;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import org.springframework.transaction.PlatformTransactionManager;

import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration //说明当前类是一个配置类

@ComponentScan //开启bean自动扫描注册功能

@EnableTransactionManagement(order = 2) //@1:设置事务拦截器的顺序是2

@EnableAspectJAutoProxy // @2:开启@Aspect Aop功能

public class MainConfig10 {

@Bean

public DataSource dataSource() {

org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();

dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);

dataSource.setUrl(“jdbc:mysql://localhost:3306/javacode2018?characterEncoding=UTF-8”);

dataSource.setUsername(“root”);

dataSource.setPassword(“root123”);

dataSource.setInitialSize(5);

return dataSource;

}

//定义一个jdbcTemplate

@Bean

public JdbcTemplate jdbcTemplate(DataSource dataSource) {

return new JdbcTemplate(dataSource);

}

//定义事务管理器transactionManager

@Bean

public PlatformTransactionManager transactionManager(DataSource dataSource) {

return new DataSourceTransactionManager(dataSource);

}

}

3.3、定义一个有事务的Service类

addUser方法上面添加了@Transactional注解,表示使用spring来管理事务,方法内部向db中插入了一条数据,为了方便分析结果,方法内部输出了2行日志

package com.javacode2018.tx.demo10;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Component;

import org.springframework.transaction.annotation.Transactional;

@Component

public class UserService {

@Autowired

private JdbcTemplate jdbcTemplate;

@Transactional

public void addUser() {

System.out.println(“--------UserService.addUser start”);

this.jdbcTemplate.update(“insert into t_user(name) VALUES (?)”, “张三”);

System.out.println(“--------UserService.addUser end”);

}

}

3.4、自定义第1个拦截器,放在事务拦截器之前执行

下面通过Aspect的方式定义了一个拦截器,顺序通过@Order(1)设置的是1,那么这个拦截器会在事务拦截器之前执行。

package com.javacode2018.tx.demo10;

import org.aopalliance.intercept.Joinpoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

@Component

@Aspect

@Order(1) //@1

public class TransactionInterceptorBefore {

@Pointcut(“execution(* com.javacode2018.tx.demo10.UserService.*(…))”)

public void pointcut() {

}

@Around(“pointcut()”)

public Object tsBefore(ProceedingJoinPoint joinPoint) throws Throwable {

System.out.println(“--------before start!!!”);

Object result = joinPoint.proceed();

System.out.println(“--------before end!!!”);

return result;

}

}

3.4、自定义第2个拦截器,放在事务拦截器后面执行

这个拦截器的order是3,会在事务拦截器后面执行。

package com.javacode2018.tx.demo10;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

@Component

@Aspect

@Order(2)

public class TransactionInterceptorAfter {

@Pointcut(“execution(* com.javacode2018.tx.demo10.UserService.*(…))”)

public void pointcut() {

}

@Around(“pointcut()”)

public Object tsAfter(ProceedingJoinPoint joinPoint) throws Throwable {

System.out.println(“--------after start!!!”);

Object result = joinPoint.proceed();

System.out.println(“--------after end!!!”);

return result;

}

}

3.5、添加测试类

package com.javacode2018.tx.demo10;

import org.junit.Before;

import org.junit.Test;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.jdbc.core.JdbcTemplate;

public class Demo10Test {

private UserService userService;

private JdbcTemplate jdbcTemplate;

@Before

public void before() {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig10.class);

userService = context.getBean(UserService.class);

this.jdbcTemplate = context.getBean(“jdbcTemplate”, JdbcTemplate.class);

jdbcTemplate.update(“truncate table t_user”);

}

@Test

public void test1() {

this.userService.addUser();

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
Template.class);

jdbcTemplate.update(“truncate table t_user”);

}

@Test

public void test1() {

this.userService.addUser();

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

[外链图片转存中…(img-sUqgma8k-1714677802673)]

[外链图片转存中…(img-PFWHxePX-1714677802674)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值