Spring 사무 관리 - 프로 그래 밍 식 사무, 성명 식 사무

29901 단어 Spring
사무 관 리 는 응용 시스템 에서 없어 서 는 안 될 일부분 으로 사용자 의 모든 조작 이 믿 을 만하 고 이상 한 상황 이 발생 하 더 라 도 배경 데이터 의 완전 성 을 파괴 하지 않도록 보장 한다.Spring 은 풍부 한 사무 관리 기능 을 제공 하고 Spring 의 사무 관 리 는 프로 그래 밍 식 사무 관리 와 성명 식 사무 관리 두 가지 방식 으로 나 뉜 다.프로 그래 밍 식 사무 관 리 는 인 코딩 을 통 해 사무 관 리 를 실현 하 는 것 을 말한다. 성명 식 사 무 는 AOP 를 바탕 으로 업무 논리 와 사무 처 리 를 결합 시킨다.성명 식 사 무 는 코드 에 대한 침입 이 비교적 적 고 실제 사용 에서 비교적 광범 위 하 게 사용 된다.
가방 의존
프로젝트 에 사용 되 는 Spring 과 MyBatis 가방 은 다음 과 같 습 니 다.
...
    <properties>
        <spring-version>4.2.2.RELEASEspring-version>
    properties>

    <dependencies>
          
        
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-beansartifactId>
            <version>${spring-version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>${spring-version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>${spring-version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>${spring-version}version>
            <scope>testscope>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-txartifactId>
            <version>${spring-version}version>
        dependency>

        
        
        
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatis-springartifactId>
            <version>1.3.0version>
        dependency>
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.3.1version>
        dependency>
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.41version>
        dependency>
...
    dependencies>
...

2. 프로 그래 밍 식 사무
Spring 프로 그래 밍 식 트 랜 잭 션 관 리 는 인 코딩 방식 으로 트 랜 잭 션 관 리 를 실현 합 니 다. 코드 에 표 시 된 getTransaction (), commt (), roolback () 등 트 랜 잭 션 관리 방법 이 필요 합 니 다. 이러한 Spring 이 제공 하 는 API 를 통 해 트 랜 잭 션 의 실행 을 유연 하 게 제어 할 수 있 습 니 다. 바 텀 에서 Spring 은 이러한 트 랜 잭 션 을 영구적 인 프레임 워 크 에 의뢰 합 니 다.Spring 프로필 config. xml 는 다음 과 같 습 니 다.

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
            http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config.propertiesvalue>
            list>
        property>
    bean>

    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>${driver}value>
        property>
        <property name="url">
            <value>${url}value>
        property>
        <property name="username">
            <value>${username}value>
        property>
        <property name="password">
            <value>${password}value>
        property>
    bean>

    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xiaofan.test" />
    bean>

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:user_mapper.xml"/>
        <property name="configLocation" value="classpath:mybatis_config.xml" />
    bean>

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

    <bean id="userService" class="com.xiaofan.test.UserService">
    bean>

beans>

PlatformTransactionManager, TransactionDefinition, TransactionStatus 세 개의 인터페이스 에 따라 프로 그래 밍 방식 으로 사무 관 리 를 할 수 있 습 니 다. TransactionDefinition 인 스 턴 스 는 하나의 사 무 를 정의 하 는 데 사 용 됩 니 다. PlatformTransactionManager 인 스 턴 스 용 어 는 사무 관리 작업 을 수행 하고 TransactionStatus 인 스 턴 스 는 업무 상 태 를 추적 하 는 데 사 용 됩 니 다.UserService 서비스 설정 은 다음 과 같 습 니 다.
public class UserService {

    @Resource
    UserDAO userDAO;

    @Resource
    DataSource dataSource;

    @Resource
    PlatformTransactionManager transactionManager;

    public void addUser(User user) throws Exception {

        TransactionDefinition def = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(def);

        try {

            // [1]     
            userDAO.insert(user);

            // [2]       
            Integer i = null;
            if (i.equals(0)) {

            }

            transactionManager.commit(status);
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
        return;
    }

}

Spring 테스트 코드 는 다음 과 같 습 니 다.
@ContextConfiguration(locations = {"classpath:config.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class Test extends AbstractJUnit4SpringContextTests{

    @Resource
    UserService userService;

    @org.junit.Test
    public void testAdd() {
        try {
            userService.addUser(new User(null, "LiLei", 25));
        } catch (Exception e) {
        }
    }
}

만약 [2] 에서 이상 을 던 지면 사 무 는 스크롤 백 을 수행 하고 [2] 에서 이상 을 던 지지 않 으 면 집행 기록 삽입 작업 을 제출한다.
다른 프로 그래 밍 식 사무 관리
상기 사무 관리 방식 은 이해 하기 쉽 지만 사무 관리 코드 는 업무 코드 에 흩 어 져 기 존 코드 의 이성 을 파괴 하고 모든 사무 방법 에는 사 무 를 시작 하고 제출 / 스크롤 백 하 는 기능 이 포함 되 어 있 습 니 다. 이 를 바탕 으로 Spring 은 간단 한 모드 리 셋 모드 (TransactionTemplate) 를 제공 합 니 다.config. xml 프로필 에 TransactionTemplate bean 설정 을 추가 합 니 다:
...
    "transactionTemplate"  class="org.springframework.transaction.support.TransactionTemplate">
        "transactionManager" ref="transactionManager"/>
    
...

TransactionTemplate 의 execute () 방법 은 TransactionCallback 형식의 매개 변수 가 있 습 니 다. 이 인터페이스 에 서 는 doInTransaction () 방법 을 정의 합 니 다. 익명 내부 의 힘 든 방식 으로 TransactionCallBack 인 터 페 이 스 를 실현 하고 업무 코드 를 doInTransaction () 방법 에 쓸 수 있 습 니 다. 업무 코드 에 서 는 모든 사물 관리 API 를 표시 할 필요 가 없습니다. 이상 스크롤 백 을 제외 하고또한 업무 코드 의 임 의 위치 에서 transactionStatus. setRollback Only () 를 통과 할 수 있 습 니 다.스크롤 백 동작 을 실행 합 니 다.UserService 서비스 코드 변경:
public class UserService {

    @Resource
    UserDAO userDAO;

    @Resource
    TransactionTemplate transactionTemplate;

    public void addUser(final User user) {

        transactionTemplate.execute(new TransactionCallback() {

            public Object doInTransaction(TransactionStatus transactionStatus) {

                userDAO.insert(user);

                // transactionStatus.setRollbackOnly();

                Integer i = null;

                if (i.equals(0)) {

                }
                return null;
            }
        });
    }
}

3. 성명 식 사무
Spring 의 성명 식 사무 관 리 는 AOP 를 바탕 으로 하 는데 그 본질은 목표 방법 이 실행 되 기 전에 차단 하고 방법 이 시작 되 기 전에 사 무 를 만 들 고 방법 을 실행 한 후에 실행 상황 에 따라 사 무 를 제출 하거나 스크롤 백 하 는 것 이다.성명 식 업무 의 가장 큰 장점 은 프로 그래 밍 을 통 해 업 무 를 관리 하지 않 아 도 된다 는 것 이다. 그러면 업무 코드 에 침입 하지 않 고 설정 파일 에서 관련 된 사물 성명 만 하면 업무 규칙 을 업무 논리 에 응용 할 수 있다.프로 그래 밍 식 트 랜 잭 션 에 비해 성명 식 트 랜 잭 션 의 유일한 부족 은 스마트 역할 이 방법 단계 에 있 는 것 입 니 다. 프로 그래 밍 식 트 랜 잭 션 처럼 코드 블록 등급 성명 식 트 랜 잭 션 까지 네 가지 방식 이 있 습 니 다. a. TransactionInterceptor 기반 성명 식 트 랜 잭 션 입 니 다.b. TransactionProxy Factory Bean 기반 성명 식 사무;c. \ 네 임 스페이스 기반 성명 식 사무;d. 레이 블 (@ Transactional) 기반 성명 식 사무.
a. TransactionInterceptor 기반 성명 식 사무
TransactionInterceptor 는 주로 두 가지 속성 이 있 습 니 다. 하 나 는 transaction Manager 로 하나의 사무 관리 자 를 지정 하 는 데 사 용 됩 니 다.다른 하 나 는 transactionAttributes 입 니 다. 키 값 이 맞 는 방식 으로 해당 방법의 사물 속성 을 지정 합 니 다. 그 중에서 키 값 은 어댑터 를 사용 할 수 있 습 니 다.config. xml 프로필 에 TransactionInterceptor 설정 을 추가 합 니 다:
...
    id="transactionInterceptor"
          class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            
                <prop key="*">PROPAGATION_REQUIREDprop>
            
        property>
    
    id="userService"
          class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target">
            class="com.xiaofan.test.UserService" />
        property>
        <property name="interceptorNames">
            <list>
                "transactionInterceptor"/>
            list>
        property>
    
...

그 중에서 업무 의 전파 행위 경 계 는 다음 과 같다.
전파 하 다.
기능.
PROPAGATION_REQUIRED
현재 트 랜 잭 션 을 지원 합 니 다. 현재 트 랜 잭 션 이 없 으 면 새 트 랜 잭 션 을 만 듭 니 다.
PROPAGATION_SUPPORT
현재 트 랜 잭 션 을 지원 합 니 다. 현재 트 랜 잭 션 이 없 으 면 비 트 랜 잭 션 으로 실 행 됩 니 다.
PROPAGATION_MANDATORY
현재 트 랜 잭 션 을 지원 합 니 다. 현재 트 랜 잭 션 이 없 으 면 이상 을 던 집 니 다.
PROPAGATION_REQUIRES_NEW
새 트 랜 잭 션, 현재 트 랜 잭 션 이 있 으 면 현재 트 랜 잭 션 을 연결 합 니 다.
PROPAGATION_NOT_SUPPORT
현재 트 랜 잭 션 이 있 으 면 현재 트 랜 잭 션 을 연결 합 니 다.
PROPAGATION_NEVER
비 사무 방식 으로 작업 합 니 다. 현재 사무 가 있 으 면 이상 을 던 집 니 다.
UserService 서비스 코드 변경:
public class UserService {

    @Resource
    UserDAO userDAO;

    public void addUser3(User user) {

        userDAO.insert(user);

        Integer i = 1;
        if (i.equals(0)) {
        }
    }
}

b. TransactionProxy Factory Bean 기반 성명 식 사무
이상 의 TransactionInterceptor 방식 을 바탕 으로 모든 서비스 bean 은 ProxyFactory Bean 을 설정 해 야 합 니 다. 이 로 인해 설정 파일 이 지루 해 질 수 있 습 니 다. 이 문 제 를 완화 하기 위해 Spring 은 TransactionProxyFactory Bean 기반 의 성명 식 사무 설정 방식 을 제공 합 니 다.config. xml 프로필 에 TransactionProxyFactory Bean 설정 을 추가 합 니 다:
...
    "userService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        "target">
            "com.xiaofan.test.UserService" />
        
        "transactionManager" ref="transactionManager"/>
        "transactionAttributes">
            
                "insert*">PROPAGATION_REQUIRED
                "update*">PROPAGATION_REQUIRED
                "*">PROPAGATION_REQUIRED
            
        
    
...

UserService 서비스 코드 는 위 와 같 으 니 변경 할 필요 가 없습니다.
c. \ 네 임 스페이스 기반 성명 식 사무
Spring 2. x 는 \ \ 네 임 스페이스 를 도 입 했 습 니 다. \ 네 임 스페이스 의 접점 표현 식 지원 을 추가 하여 성명 식 사 무 는 더욱 강해 집 니 다. 접점 표현 식 을 통 해 모든 업무 클래스 에 대 리 를 만 들 필요 가 없습니다.동적 에이 전 트 를 사용 하기 위해 서 는 먼저 pom 의존 도 를 추가 해 야 합 니 다.
...
        
            org.aspectj
            aspectjweaver
            1.7.4
        
...

config. xml 파일 에 다음 설정 을 추가 합 니 다:
...
   "userService" class="com.xiaofan.test.UserService">
    
    "userAdvice" transaction-manager="transactionManager">
        
            "*" propagation="REQUIRED"/>
        
    
    
        "userPointcut" expression="execution (* com.xiaofan.test.*.*(..))"/>
        "userAdvice" pointcut-ref="userPointcut"/>
    
...

UserService 서비스 코드 는 위 와 같 으 니 변경 할 필요 가 없습니다.
d. 레이 블 기반 (@ Transactional) 성명 식 사무
네 임 스페이스 기반 트 랜 잭 션 설정 방식 을 제외 하고 Spring2. x 는 주 해 를 기반 으로 하 는 방식 도 도입 했다. 주로 @ Transactional 주 해 를 포함 하 는데 인터페이스, 인터페이스 방법, 클래스 와 클래스 의 방법 에 작용 할 수 있다. 클래스 에 사용 할 때 이 유형의 모든 Public 방법 은 이 유형의 트 랜 잭 션 속성 을 가지 고 방법 급 트 랜 잭 션 에 덮어 쓸 수 있다.config. xml 프로필 에 주석 식별 설정 추가:
...
    "transactionManager"/>
...

@ Transactional 주 해 는 Public 방법 에 적용 되 어야 합 니 다. 이것 은 AOP 의 본질 에 의 해 결 정 됩 니 다. proctected, private 방법 에 적용 되면 사 무 는 무 시 됩 니 다.UserService 서비스 코드 는 다음 과 같 습 니 다.
public class UserService {

    @Resource
    UserDAO userDAO;

    @Transactional(propagation = Propagation.REQUIRED)
    public void addUser4(User user) {

        userDAO.insert(user);

        Integer i = 1;
        if (i.equals(0)) {

        }

    }
}

@ Transactional 주해 의 전체 속성 정 보 는 다음 표 [1]:
속성 명
기능.
name
여러 트 랜 잭 션 관리자 중 하 나 를 선택 할 트 랜 잭 션 관리 자 를 지정 합 니 다.
propagation
트 랜 잭 션 전파 행위, 기본 값 은 REQUIRED
isolation
트 랜 잭 션 개수, 기본 값 DEFAULT
timeout
트 랜 잭 션 시간 초과, 기본 값 은 - 1 입 니 다.
read-only
읽 기 전용 으로 지정 합 니 다. 기본 값 은 false 입 니 다.
rollback-for
트 랜 잭 션 스크롤 백 을 실행 할 이상 형식 을 지정 합 니 다. 여러 개의 이상 은 쉼표 로 구 분 됩 니 다.
no-rollback-for
지정 한 이상 유형 을 던 지고 스크롤 백 하지 않 습 니 다.
\ \ 네 임 스페이스 와 주 해 를 기반 으로 하 는 트 랜 잭 션 성명 은 각각 장단 점 이 있 습 니 다. \ \ 를 기반 으로 한 설정 은 여러 가지 방법 과 일치 할 수 있 지만 설정 은 주해 방식 이 복잡 합 니 다.주 해 를 바탕 으로 하 는 방식 은 모든 사 무 를 사용 해 야 하 는 방법 이나 유형 에 표시 해 야 하지만 표 시 를 바탕 으로 하 는 방법 은 학습 원가 가 더욱 낮다.

좋은 웹페이지 즐겨찾기