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
大传播机制的底层原理。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。