一個轉賬案例-Spring聲明式事務全註解開發

xml配置文件

在使用全註解形式去完成轉賬案例之前,我們先看看在使用純xml配置的applicationConfiguration.xml

<bean id="accountDao" class="com.xxx.dao.impl.AccountDaoImpl">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql:///account_db"/>
    <property name="user" value="root"/>
    <property name="password" value="123456"/>
</bean>

<bean id="accountService" class="com.xxx.service.impl.AccountServiceImpl">
    <property name="accountDao" ref="accountDao"/>
</bean>

<!--配置平臺事務管理器 同樣要依賴dataSource-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!--通知事務的增強-->
<!--propagation 事務傳播行爲
REQUIRED:指定當前方法必需在事務環境中運行,如果當前有事務環境就加入當前正在執行的事務環境,
如果當前沒有事務,就新建一個事務。這是默認值。
isolation 事務隔離級別
DEFAULT:採用數據庫默認隔離級別-->
<tx:advice id="tx" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="transfer" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="find" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<!--事務的織入-->
<aop:config proxy-target-class="true">
    <aop:advisor advice-ref="tx" pointcut="execution(* com.xxxservice.impl.*.*(..))"/>
</aop:config>

全註解形式源碼

  1. 建表

     CREATE TABLE account(
     	id INT PRIMARY KEY AUTO_INCREMENT,
     	NAME VARCHAR(20),
     	money DECIMAL
     );
    
  2. 導入所需座標

     <dependencies>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
             <version>5.0.5.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>org.aspectj</groupId>
             <artifactId>aspectjweaver</artifactId>
             <version>1.8.4</version>
         </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-jdbc</artifactId>
             <version>5.0.5.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-tx</artifactId>
             <version>5.0.5.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
             <version>5.0.5.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>c3p0</groupId>
             <artifactId>c3p0</artifactId>
             <version>0.9.1.2</version>
         </dependency>
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.32</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.12</version>
         </dependency>
     </dependencies>
    
  3. AccountDaoImpl.java

     @Repository
     public class AccountDaoImpl implements AccountDao {
     
     @Autowired
     private JdbcTemplate jdbcTemplate;
    
    
     public void out(String outMan, double money) {
         jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);
     }
    
     public void in(String inMan, double money) {
         jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);
     }
    

    }

  4. AccountServiceImpl.java

     @Service
     @EnableTransactionManagement
     public class AccountServiceImpl implements AccountService {
     
         @Autowired
         private AccountDao accountDao;
     
         @Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED,readOnly = false)
         public void transfer(String outMan, String inMan, double money) {
             accountDao.out(outMan,money);
     //        int i = 1/0;
             accountDao.in(inMan,money);
         }
     }
    
  5. SpringConfiguration.java

     @Configuration
     @ComponentScan("com.xxx")
     @Import(DataSourceConfiguration.class)
     public class SpringConfiguration {
     
     }
    
  6. DataSourceConfiguration.java

     @Configuration
     @PropertySource("classpath:jdbc.properties")
     public class DataSourceConfiguration {
     
     
         @Value("${jdbc.driver}")
         private String driverClass;
         @Value("${jdbc.url}")
         private String url;
         @Value("${jdbc.username}")
         private String user;
         @Value("${jdbc.password}")
         private String password;
     
         @Bean
         public DataSource getDataSource() throws PropertyVetoException {
             ComboPooledDataSource dataSource = new ComboPooledDataSource();
             dataSource.setDriverClass(driverClass);
             dataSource.setJdbcUrl(url);
             dataSource.setUser(user);
             dataSource.setPassword(password);
             return dataSource;
         }
     
         @Bean
         public JdbcTemplate getTemplate(DataSource dataSource){
             return new JdbcTemplate(dataSource);
         }
         @Bean
         public DataSourceTransactionManager getDSTM(DataSource dataSource){
             return new DataSourceTransactionManager(dataSource);
         }
     }
    
  7. jdbc.properties

     jdbc.driver=com.mysql.jdbc.Driver
     jdbc.url=jdbc:mysql:///account_db
     jdbc.username=root
     jdbc.password=123456
    
  8. 測試

     @RunWith(SpringJUnit4ClassRunner.class)
     @ContextConfiguration(classes = SpringConfiguration.class)
     public class AnnoTest {
         @Autowired
         private AccountService accountService;
         @Test
         public void test02(){
             accountService.transfer("tom","lucy",500f);
         }
     }
    

覺得有用不如進入我的Github博客留個言吧,謝謝支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章