Spring事務(三)-プログラミング式事務コードの実践


プログラミング事務
やはり経典のケースを採用して銀行振込をしてコードを構築します.張三と李四の口座が1000元あると仮定して、張三は李四に200元振り込みして、springがどのように事務を管理しているかを観察します.
一、コードの例
①dao類:
/**
 *    :taofut
 *     :2019-01-08 19:31
 *   :
 */
public interface AccountDao {

    /**
     * @param out     
     * @param money     
     */
    public void outMoney(String out,Double money);

    /**
     * @param in     
     * @param money     
     */
    public void inMoney(String in,Double money);

}
②dao実現類:
/**
 *    :taofut
 *     :2019-01-08 19:33
 *   :
 */
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {

    /**
     * @param out     
     * @param money     
     */
    public void outMoney(String out, Double money) {
        String sql="update account set money = money - ? where name = ?";
        this.getJdbcTemplate().update(sql,money,out);
    }

    /**
     * @param in     
     * @param money     
     */
    public void inMoney(String in, Double money) {
        String sql="update account set money = money + ? where name = ?";
        this.getJdbcTemplate().update(sql,money,in);
    }
}
③service類:
/**
 *    :taofut
 *     :2019-01-08 19:26
 *   :      
 */
public interface AccountService {

    /**
     * @param out     
     * @param in      
     * @param money     
     */
    public void transfer(String out,String in,Double money);

    /**
     * @param out     
     * @param in      
     * @param money     
     */
    public void transferException(String out,String in,Double money);

    /**
     * @param out     
     * @param in      
     * @param money     
     */
    public void transferTransaction(String out, String in, Double money);


}
④service実現類:
/**
 *    :taofut
 *     :2019-01-08 19:29
 *   :
 */
public class AccountServiceImpl implements AccountService {

    private AccountDao accountDao;

    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    /**         */
    private TransactionTemplate transactionTemplate;

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }

    /**
     * @param out     
     * @param in      
     * @param money     
     */
    public void transfer(String out, String in, Double money) {
        accountDao.outMoney(out,money);
        accountDao.inMoney(in,money);
    }

    /**
     * @param out     
     * @param in      
     * @param money     
     */
    public void transferException(String out, String in, Double money) {
        accountDao.outMoney(out,money);
        int i = 1 / 0;
        accountDao.inMoney(in,money);
    }

    /**
     * @param out     
     * @param in      
     * @param money     
     */
    public void transferTransaction(final String out, final String in, final Double money) {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                //           
                accountDao.outMoney(out,money);
                int i = 1 / 0;
                accountDao.inMoney(in,money);
            }
        });
    }

}
⑤プロファイルappication Contect.xml:


    
    
    
    
    
        
        
        
        
        
        
    

    
    
        
        
        
    

    
    
        
    

    
    
        
    

    
    
        
    


二、スプリング事務所の必要条件①リソースファイルには事務管理器と事務管理テンプレートを配置し、事務配置テンプレートには事務管理器を参照し、service類には事務管理テンプレートを参照してください.②サービス類のどの方法に事務を追加する必要がありますか?この方法の内容を下記のコードに記入します.
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
        //           
        ...
    }
});
三、コードテスト結果
import com.ft.demo1.AccountService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

/**
 *    :taofut
 *     :2019-01-08 20:29
 *   :       
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringTest1 {

    @Resource(name = "accountService")
    private AccountService accountService;

    @Test
    public void demo1(){
        accountService.transferTransaction("zhangsan","lisi",200d);
        System.out.println("    ...");
    }
}
追加していません:
public void transferTransaction(final String out, final String in, final Double money) {
	 accountDao.outMoney(out,money);
     int i = 1 / 0;
     accountDao.inMoney(in,money);
}
張三さんは李四さんに200元回転しました.その後異常が発生しました.李四は200元の操作を増加しましたが、最後に張三が200元回転しました.李四はお金をもらえませんでした.200元がこのように消えてしまいました.これは明らかに不合理です.
追加事務:
public void transferTransaction(final String out, final String in, final Double money) {
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
            //           
            accountDao.outMoney(out,money);
            int i = 1 / 0;
            accountDao.inMoney(in,money);
        }
    });
}
張三さんは李四さんに200元回転して、異常が発生しました.最後に張三200元を引き出しませんでした.李四もお金をもらえませんでした.
四、プログラミング式の事務をまとめると、文面の意味から分かります.コードを手動で作成する必要があります.「スプリング事務所の要件」から知っています.多くのサービスに事務を追加する場合、資源書類にはサービスがたくさん配置されています.そして、各サービスは事務管理テンプレートを参照してください.各方法の内容も事務配置のテンプレート方法で小包に入れます.このようなやり方は結合度が高く、開発作業量も大きいので、実際の生活で使うものは少ないです.