Spring 프로 그래 밍 과 성명 식 트 랜 잭 션 인 스 턴 스 설명 소결

사무 관리
Spring 은 두 가지 방식 의 사무 관 리 를 지원 합 니 다.
  • 프로 그래 밍 식 사무 관리:Transaction Template 를 통 해 수 동 으로 업 무 를 관리 하고 실제 응용 에서 거의 사용 하지 않 습 니 다
  • XML 설정 성명 식 사무 사용:추천 사용(코드 침입 성 최소),실제 AOP 를 통 해 이 루어 집 니 다
  • 성명 식 사 무 를 실현 하 는 네 가지 방식:
  • TransactionInterceptor 를 바탕 으로 하 는 성명 식 사무:Spring 성명 식 사 무 를 바탕 으로 이런 방식 을 사용 하 는 것 을 권장 하지 않 지만 앞에서 와 마찬가지 로 이런 방식 을 이해 하 는 것 은 Spring 성명 식 사 무 를 이해 하 는 데 큰 역할 을 한다
  • TransactionProxy Factory Bean 을 바탕 으로 하 는 성명 식 사무:첫 번 째 방식 의 개선 버 전,간단 한 프로필 작성,이것 은 Spring 이 초기 에 추천 한 성명 식 사무 관리 방식 이지 만 Spring 2.0 에 서 는 추천 하지 않 습 니 다
  • 네 임 스페이스 를 바탕 으로 하 는 성명 식 사무 관리:현재 추천 하 는 방식 은 Spring AOP 와 밀접 하 게 결합 하여 접점 식 의 강력 한 지원 을 충분히 이용 하여 관리 업 무 를 더욱 유연 하 게 하 는 것 이 가장 큰 특징 입 니 다
  • 4.567917.@Transactional 의 전체 주석 방식 을 바탕 으로 성명 식 사무 관 리 를 극치 로 간소화 했다.개발 자 는 설정 파일 에 빈 의 설정 을 사용 한 다음 에 사무 관 리 를 실시 해 야 하 는 방법 이나 클래스 에@Transactional 지정 사무 규칙 을 사용 하면 사무 관 리 를 실현 할 수 있 고 기능 도 다른 방식 으로 손 색 이 없 을 수 있 습 니 다우리 가 오늘 하려 는 것 은 프로 그래 밍 식 과 AspectJ 를 바탕 으로 하 는 성명 식 과 주 해 를 바탕 으로 하 는 사무 방식 을 사용 하여 나 쁜 거리의 이체 업 무 를 실현 하 는 것 이다.
    이 사례 의 사상 을 다시 한 번 말씀 드 리 겠 습 니 다.우 리 는 두 번 의 이체 사이 에 잘못된 문 구 를 추가 합 니 다(은행 의 전기 가 끊 기 는 등 의외 의 상황 에 대응).만약 에 이때 두 번 의 이체 가 성공 하지 못 하면 업무 설정 이 정확 하 다 는 것 을 설명 합 니 다.그렇지 않 으 면 업무 설정 이 정확 하지 않 습 니 다.
    당신 이 완성 해 야 할 임무:
  • 프로 그래 밍 식 사무 관 리 를 이용 하여 이체 업 무 를 완성 한다
  • AspectJ 를 바탕 으로 하 는 성명 식 사무 관 리 를 사용 하여 이체 업 무 를 완성 한다
  • 4.567917.@Transactional 을 바탕 으로 하 는 전체 주석 방식 의 사무 관 리 를 사용 하여 이체 업 무 를 완성 합 니 다비고:
    아래 의 코드 는 아주 오래 전에 Sping 을 배 웠 는데 Maven 과 접촉 하지 않 았 을 때 쓴 것 입 니 다.그래서 제 가 사용 한 원시 적 인 jar 추가 방식 은 Maven 의 파트너 를 사용 하면 Maven 의존 도 를 스스로 추가 할 수 있 습 니 다.
    프로젝트 구성:
    Spring 프로 그래 밍 과 성명 식 트 랜 잭 션 인 스 턴 스 설명

    개발 도구:
    Myeclipse2017
    SQL:
    
    create table `account` (
     `username` varchar (99),
     `salary` int (11)
    ); 
    insert into `account` (`username`, `salary`) values('  ','3000');
    insert into `account` (`username`, `salary`) values('  ','3000');
    (1)프로 그래 밍 식 사무 관리
    메모:accontMoney()방법 중 int i=10/0 을 추가/삭제 하면 사무 관리 설정 이 올 바른 지 검증 할 수 있 습 니 다.
    Orders Dao.java(Dao 층)
    
    package cn.itcast.dao;
    import org.springframework.jdbc.core.JdbcTemplate;
    public class OrdersDao {
     //   jdbcTemplate    
     private JdbcTemplate jdbcTemplate;
     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
     this.jdbcTemplate = jdbcTemplate;
     }
     //                
     /**
     *        
     */
     public void reduceMoney() {
     String sql = "update account set salary=salary-? where username=?";
     jdbcTemplate.update(sql, 1000, "  ");
     }
     /**
     *        
     */
     public void addMoney() {
     String sql = "update account set salary=salary+? where username=?";
     jdbcTemplate.update(sql, 1000, "  ");
     }
    }
    
    Orders Service.java(비 즈 니스 논리 층)
    
    package cn.itcast.service;
    import org.springframework.transaction.TransactionStatus;
    import org.springframework.transaction.support.TransactionCallback;
    import org.springframework.transaction.support.TransactionTemplate;
    import cn.itcast.dao.OrdersDao;
    public class OrdersService {
     //   Dao   
     private OrdersDao ordersDao;
     public void setOrdersDao(OrdersDao ordersDao) {
     this.ordersDao = ordersDao;
     }
     //   TransactionTemplate  
     private TransactionTemplate transactionTemplate;
     public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
     this.transactionTemplate = transactionTemplate;
     }
     //   dao   
     //     ,     
     public void accountMoney() {
     transactionTemplate.execute(new TransactionCallback<Object>() {
      @Override
      public Object doInTransaction(TransactionStatus status) {
      Object result = null;
      try {
       //    1000
       ordersDao.addMoney();
       //          int
       // i=10/0(           。。。);  :      1000         
       //                 
       int i = 10 / 0;//              
       //     1000
       ordersDao.reduceMoney();
      } catch (Exception e) {
       status.setRollbackOnly();
       result = false;
       System.out.println("Transfer Error!");
      }
      return result;
      }
     });
     }
    }
    
    TestService.java(테스트 방법)
    
    package cn.itcast.service;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class TestService {
     @Test
     public void testAdd() {
     ApplicationContext context = new ClassPathXmlApplicationContext(
      "beans.xml");
     OrdersService userService = (OrdersService) context
      .getBean("ordersService");
     userService.accountMoney();
     }
    }
    
    프로필:
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
     <!--   c3po    -->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     <!--       -->
     <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/wangyiyun"></property>
     <property name="user" value="root"></property>
     <property name="password" value="153963"></property>
     </bean>
     <!--         -->
     <!--         -->
     <bean id="dataSourceTransactionManager"
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <!--   dataSource -->
     <property name="dataSource" ref="dataSource"></property>
     </bean>
     <!--           -->
     <bean id="transactionTemplate"
     class="org.springframework.transaction.support.TransactionTemplate">
     <!--                 ,name    transactionManager       -->
     <property name="transactionManager" ref="dataSourceTransactionManager"></property>
     </bean>
     <!--           -->
     <bean id="ordersService" class="cn.itcast.service.OrdersService">
     <property name="ordersDao" ref="ordersDao"></property>
     <!--           -->
     <property name="transactionTemplate" ref="transactionTemplate"></property>
     </bean>
     <bean id="ordersDao" class="cn.itcast.dao.OrdersDao">
     <property name="jdbcTemplate" ref="jdbcTemplate"></property>
     </bean>
     <!-- JDBC     -->
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     <property name="dataSource" ref="dataSource"></property>
     </bean>
    </beans>
    
    (2)AspectJ 기반 성명 식 사무 관리
    Orders Service.java(비 즈 니스 논리 층)
    
    package cn.itcast.service;
    import cn.itcast.dao.OrdersDao;
    public class OrdersService {
     private OrdersDao ordersDao;
     public void setOrdersDao(OrdersDao ordersDao) {
     this.ordersDao = ordersDao;
     }
     //   dao   
     //     ,     
     public void accountMoney() {
     //    1000
     ordersDao.addMoney();
     //          int i=10/0(           。。。);  :      1000         
     //                 
     int i = 10 / 0;//              
     //     1000
     ordersDao.reduceMoney();
     }
    }
    
    프로필:
     
    
    <!--   c3po    -->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     <!--       -->
     <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/wangyiyun"></property>
     <property name="user" value="root"></property>
     <property name="password" value="153963"></property>
     </bean>
     <!--    :        -->
     <bean id="dataSourceTransactionManager"
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <!--   dataSource -->
     <property name="dataSource" ref="dataSource"></property>
     </bean>
     <!--    :       -->
     <tx:advice id="txadvice" transaction-manager="dataSourceTransactionManager">
     <!--       -->
     <tx:attributes>
      <!--                 -->
      <!-- account        -->
     <!--
     propagation:      ; 
     isolation:      ;
     read-only:    ;
     rollback-for:          
     timeout:      
     -->
      <tx:method name="account*" propagation="REQUIRED"
      isolation="DEFAULT" read-only="false" rollback-for="" timeout="-1" />
     </tx:attributes>
     </tx:advice>
     <!--    :                   -->
     <aop:config>
     <!--     -->
     <aop:pointcut expression="execution(* cn.itcast.service.OrdersService.*(..))"
      id="pointcut1" />
     <!--    -->
     <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1" />
     </aop:config>
     <!--           -->
     <bean id="ordersService" class="cn.itcast.service.OrdersService">
     <property name="ordersDao" ref="ordersDao"></property>
     </bean>
     <bean id="ordersDao" class="cn.itcast.dao.OrdersDao">
     <property name="jdbcTemplate" ref="jdbcTemplate"></property>
     </bean>
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     <property name="dataSource" ref="dataSource"></property>
     </bean>
    
    (3)주석 기반 방식
    Orders Service.java(비 즈 니스 논리 층)
    
    package cn.itcast.service;
    import org.springframework.transaction.annotation.Isolation;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    import cn.itcast.dao.OrdersDao;
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = -1)
    public class OrdersService {
     private OrdersDao ordersDao;
     public void setOrdersDao(OrdersDao ordersDao) {
     this.ordersDao = ordersDao;
     }
     //   dao   
     //     ,     
     public void accountMoney() {
     //    1000
     ordersDao.addMoney();
     //          int i=10/0(           。。。);  :      1000         
     //                 
     // int i = 10 / 0;//              
     //     1000
     ordersDao.reduceMoney();
     }
    }
    
    프로필:
    
     <!--   c3po    -->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     <!--       -->
     <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/wangyiyun"></property>
     <property name="user" value="root"></property>
     <property name="password" value="153963"></property>
     </bean>
     <!--    :        (         )-->
     <bean id="dataSourceTransactionManager"
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <!--   dataSource -->
     <property name="dataSource" ref="dataSource"></property>
     </bean>
     <!--    :        -->
     <tx:annotation-driven transaction-manager="dataSourceTransactionManager" />
     <!--                -->
     
     
     <!--           -->
     <bean id="ordersService" class="cn.itcast.service.OrdersService">
     <property name="ordersDao" ref="ordersDao"></property>
     </bean>
     <bean id="ordersDao" class="cn.itcast.dao.OrdersDao">
     <property name="jdbcTemplate" ref="jdbcTemplate"></property>
     </bean>
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     <property name="dataSource" ref="dataSource"></property>
     </bean>
    
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기