美文网首页
Spring使用XML的方式配置事务

Spring使用XML的方式配置事务

作者: BlueSkyBlue | 来源:发表于2020-03-20 19:11 被阅读0次

    除了可以使用注解的方式配置事务,我们还可以通过XML文件来配置事务。

    事前准备

    创建接口

    public interface BookShopDAO {
        public int findBookPriceByISBN(int ISBN);
        public void updateBookStock(int ISBN);
        public void updateUserAccount(String username, int price);
    }
    
    public interface BookShopService {
        public void purchase(String username, int ISBN);
    }
    
    public interface Cashier {
        public void checkout(String username, List<Integer> isbns);
    }
    

    实现类

    public class BookShopDAOImpl implements BookShopDAO {
        private JdbcTemplate jdbcTemplate;
    
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        @Override
        public int findBookPriceByISBN(int ISBN) {
            String sql = "select price from book where isbn = ? ";
            return jdbcTemplate.queryForObject(sql, Integer.class, ISBN);
        }
    
        @Override
        public void updateBookStock(int ISBN) {
            String sql = "update book_stock set stock = stock - 1 where isbn = ? ";
            jdbcTemplate.update(sql, ISBN);
        }
    
        @Override
        public void updateUserAccount(String username, int price) {
            String sql = "update account set balance = balance - ? where username = ? ";
            jdbcTemplate.update(sql, price, username);
        }
    }
    
    public class BookShopServiceImpl implements BookShopService {
        private BookShopDAO bookShopDAO;
    
        public void setBookShopDAO(BookShopDAO bookShopDAO) {
            this.bookShopDAO = bookShopDAO;
        }
    
        @Override
        public void purchase(String username, int ISBN) {
            int price = bookShopDAO.findBookPriceByISBN(ISBN);
            bookShopDAO.updateBookStock(ISBN);
            bookShopDAO.updateUserAccount("AA", price);
        }
    }
    
    public class CashierImpl implements Cashier {
        private BookShopService bookShopService;
    
        public void setBookShopService(BookShopService bookShopService) {
            this.bookShopService = bookShopService;
        }
    
        @Override
        public void checkout(String username, List<Integer> isbns) {
            for(Integer isbn: isbns){
                bookShopService.purchase(username, isbn);
            }
        }
    }
    

    配置文件

    首先在Spring的配置为文件中配置事务管理需要用到的类

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    <bean id="bookShopDAO" class="com.spring.xml.BookShopDAOImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    
    <bean id="bookShopService" class="com.spring.xml.BookShopServiceImpl">
        <property name="bookShopDAO" ref="bookShopDAO"></property>
    </bean>
    
    <bean id="cashier" class="com.spring.xml.CashierImpl">
        <property name="bookShopService" ref="bookShopService"></property>
    </bean>
    

    配置事务管理器

    <bean id="dataSourceTransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    

    配置事务属性

    <tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager">
        <tx:attributes>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    

    配置事务切入点,以及把事务切入点和事务属性关联起来

    <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* com.spring.xml.BookShopDAO.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>
    

    最后是测试类

    public class TransactionTest {
        private ApplicationContext ctx = null;
        private Cashier cashier = null;
    
        {
            ctx = new ClassPathXmlApplicationContext("application-context-tx.xml");
            cashier = ctx.getBean(Cashier.class);
        }
    
        @Test
        public void test(){
            cashier.checkout("AA", Arrays.asList(1001));
        }
    }
    

    相关文章

      网友评论

          本文标题:Spring使用XML的方式配置事务

          本文链接:https://www.haomeiwen.com/subject/anhsyhtx.html