Spring注解 TX聲明式事務(wù)實現(xiàn)過程解析
環(huán)境搭建導(dǎo)入
maven依賴
<!--spring提供的數(shù)據(jù)庫操作工具--><dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version></dependency><!--c3p0 數(shù)據(jù)庫連接池--><dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version></dependency><!--mysql連接器--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version></dependency>
配置數(shù)據(jù)庫相關(guān)信息
@Configuration@ComponentScan('com.spring.tx')public class TxConfig { /** * 配置數(shù)據(jù)源 */ @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setUser('root'); comboPooledDataSource.setPassword('root'); comboPooledDataSource.setDriverClass('com.mysql.jdbc.Driver'); comboPooledDataSource.setJdbcUrl('jdbc:mysql:///test'); return comboPooledDataSource; } @Bean public JdbcTemplate jdbcTemplate() throws PropertyVetoException { //Spring對配置類做了特殊處理,多次調(diào)用給容器中加組件的方法,其實是從容器中找組件,并不會重新添加 return new JdbcTemplate(dataSource()); }}
添加數(shù)據(jù)訪問層、業(yè)務(wù)層
@Repositorypublic class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public void saveUser(String name, Integer age) { String sql = 'insert into user(name, age) values(?, ?)'; jdbcTemplate.update(sql, name, age); }}
@Servicepublic class UserService { @Autowired private UserDao userDao; public void saveUser(){ String name = 'jack11'; Integer age = 19; userDao.saveUser(name, age); }}
添加測試類
public class TxTest { @Test public void test(){ ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class); UserService userService = (UserService) context.getBean('userService'); userService.saveUser(); }}
事務(wù)問題
此時基本環(huán)境已經(jīng)搭建好了,點擊運行,數(shù)據(jù)可以成功插入但是還沒有配置事務(wù),沒有事務(wù)回滾會造成某些情況下數(shù)據(jù)出錯。在Spring注解中,可以在需要添加事務(wù)的方法或類上加@Transactional,并且開啟事務(wù)管理功能,即@EnableTransactionManagement,代碼如下:
修改UserService 的 saveUser 方法
@Transactionalpublic void saveUser(){ String name = 'jack11'; Integer age = 19; userDao.saveUser(name, age); //模擬異常 int i = 1 / 0;}
在配置類加上@EnableTransactionManagement
@Configuration@ComponentScan('com.spring.tx')@EnableTransactionManagementpublic class TxConfig {//省略數(shù)據(jù)源、jdbcTemplate的配置}
再次運行測試方法,會發(fā)現(xiàn)報錯了,但不是我們模擬的異常報錯,控制臺提示找不到bean
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ’org.springframework.transaction.PlatformTransactionManager’ available
我們還需要注冊一個事務(wù)管理器來管理事務(wù),PlatformTransactionManager有很多實現(xiàn)類,在Spring 中 JdbcTemplate、Mybatis應(yīng)該使用 DataSourceTransactionManager
在配置類中再注冊一個組件,運行,事務(wù)生效
/** * 注冊事務(wù)管理器 */@Beanpublic PlatformTransactionManager platformTransactionManager() throws PropertyVetoException { return new DataSourceTransactionManager(dataSource());}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 輕松學(xué)習XML教程2. xpath簡介_動力節(jié)點Java學(xué)院整理3. jsp+servlet簡單實現(xiàn)上傳文件功能(保存目錄改進)4. jsp EL表達式詳解5. .NET SkiaSharp 生成二維碼驗證碼及指定區(qū)域截取方法實現(xiàn)6. msxml3.dll 錯誤 800c0019 系統(tǒng)錯誤:-2146697191解決方法7. css代碼優(yōu)化的12個技巧8. jsp cookie+session實現(xiàn)簡易自動登錄9. jsp實現(xiàn)登錄驗證的過濾器10. 解析原生JS getComputedStyle
