59、Spring5.x源码之旅六十AOP事务实战一

  • JDK动态代理
  • 实战
    • TransactionConfig配置类
  • db.properties数据库配置信息
  • AccountDao
  • AccountDaoImpl
  • UserDao
  • UserDaoImpl
  • 测试方法

JDK动态代理

前面讲了事务注解的属性获取,如果发现有实例的方法有事务后面就会进行动态代理,其实和前面AOP流程一样的。
*
*

实战

首先事务需要数据库支持,我们就用mysql,然后需要数据源,我们用默认的DriverManagerDataSource,然后我们还用JdbcTemplate,然后还需要一个DataSourceTransactionManager,否则用不了,会报异常。

TransactionConfig配置类

@Configuration
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
public class TransactionConfig {
   
     
    @Value("${jdbc.driver}")
    private String driverClassname;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource() {
   
     
        DriverManagerDataSource data = new DriverManagerDataSource();
        data.setDriverClassName(driverClassname);
        data.setUrl(url);
        data.setUsername(username);
        data.setPassword(password);
        return data;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
   
     
        return new JdbcTemplate(dataSource);
    }

    @Bean
    public UserDao userDao() {
   
     
        return new UserDaoImpl();
    }

    @Bean
    public AccountDao accountDao() {
   
     
        return new AccountDaoImpl();
    }
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
   
     
        return new DataSourceTransactionManager(dataSource);
    }
}

db.properties数据库配置信息

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456

AccountDao

public interface AccountDao {
   
     
    void insertTest1();
}

AccountDaoImpl

public class AccountDaoImpl implements AccountDao {
   
     
    @Autowired
    JdbcTemplate jdbcTemplate;

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void insertTest1() {
   
     
        Account account=new Account();
        account.setMoney(100);
        jdbcTemplate.update("insert into account (money) value(?)", new Object[]{
   
     account.getMoney()});
        System.out.println(1 / 0);
    }
}

UserDao

public interface UserDao {
   
     
    void test();
}

UserDaoImpl

public class UserDaoImpl implements UserDao {
   
     
    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    AccountDao accountDao;
    
    @Transactional(propagation = Propagation.REQUIRED)
 	@Override
    public void test() {
   
     

        User user = new User();
        user.setUsername("n1");
        user.setPassword("p1");
        jdbcTemplate.update("insert into user (username,password) value(?,?)", new Object[]{
   
     user.getUsername(), user.getPassword()});
		accountDao.insertTest1();
    }
}

测试方法

主要是用UserDaotest测试,里面调动另外一个AccountDaoinsertTest1,这样起码有两个事物注解,基本可以演示7个传播机制。

    @Test
    public void DBTest() {
   
     
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(TransactionConfig.class);
        applicationContext.refresh();
 		UserDao userDao = applicationContext.getBean(UserDao.class);
        userDao.test();
}

后面基本就是围绕这个例子来改的,来揭露7大传播机制的底层原理。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。