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();
}
}
测试方法
主要是用UserDao
的test
测试,里面调动另外一个AccountDao
的insertTest1
,这样起码有两个事物注解,基本可以演示7
个传播机制。
@Test
public void DBTest() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(TransactionConfig.class);
applicationContext.refresh();
UserDao userDao = applicationContext.getBean(UserDao.class);
userDao.test();
}
后面基本就是围绕这个例子来改的,来揭露7
大传播机制的底层原理。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。