Spring 의 사무 메커니즘 인 스 턴 스 코드

본 고 는 주로 Spring 의 사무 체제 와 관련 된 내용 을 연구 하 는데 구체 적 으로 다음 과 같다.
JAVA EE 전통 사무 메커니즘
일반적으로 두 가지 사무 전략 이 있 는데 그것 이 바로 전역 사무 와 국부 사무 이다.전역 사 무 는 여러 개의 사무 적 자원(즉,데이터 원본,전형 적 인 것 은 데이터베이스 와 메시지 대기 열)을 뛰 어 넘 을 수 있 습 니 다.보통 J2EE 응용 서버 의 관리 가 필요 합 니 다.그 밑 에 서버 의 JTA 지원 이 필요 합 니 다.한편,국 지적 인 사 무 는 바 텀 에서 사용 하 는 지구 화 기술 과 관련 이 있 는데 만약 에 바 텀 에서 JDBC 를 직접 사용 하면 Connection 대상 으로 사 무 를 처리 해 야 한다.Hibernate 지구 화 기술 을 사용 하려 면 session 대상 을 사용 하여 업 무 를 조작 해 야 합 니 다.
일반적으로 JTA 사무,JDBC 사무 및 Hibernate 사 무 를 사용 하 는 프로 그래 밍 절 차 는 다음 과 같 습 니 다.

위의 그림 에서 도 알 수 있 듯 이 전통 적 인 트 랜 잭 션 프로 그래 밍 을 사용 하면 프로그램 코드 는 구체 적 인 트 랜 잭 션 전략의 API 와 결합 해 야 한다.만약 에 하나의 전략 을 전환 해 야 한다 면 코드 를 대폭 수정 해 야 한 다 는 것 을 의미한다.하지만 스프링 사 무 를 사용한다 면 이 문 제 는 없 을 것 이다.
Spring 사무 메커니즘
Sring 은 어떠한 사무 지원 도 제공 하지 않 았 습 니 다.이것 은 포장 밑바닥 의 업무 만 맡 고 Spring 차원 에서 대외 적 으로 통 일 된 프로 그래 밍 API 를 제공 합 니 다.Spring 트 랜 잭 션 의 핵심 은 PlatformTransactionManager 인터페이스 입 니 다.
PlatformTransactionManager 는 구체 적 인 유형 과 무관 한 사무 인 터 페 이 스 를 대표 하 며 JDBC 사무,Hibernate 사무,심지어 JTA 사 무 를 포함 한 모든 사 무 를 대표 할 수 있 습 니 다.
Springa 사무 체 제 는 전형 적 인 전략 모델 이다.PlatformTransactionManager 는 사무 관리 인 터 페 이 스 를 대표 하지만 사 무 를 어떻게 관리 하 는 지 모 르 고 사무 관리 에 시작 사무getTransaction(),제출 사무commit()와 스크롤 백 사무rollback()라 는 세 가지 방법 만 요구 하지만 구체 적 으로 어떻게 실현 하 는 지 는 실제 유형 에 맡 겨 야 한다.프로그래머 는 설정 파일 에서 구체 적 으로 사용 해 야 할 트 랜 잭 션 유형 에 따라 설정 하면 Spring 바 텀 은 자동 으로 구체 적 인 트 랜 잭 션 실현 류 를 사용 하여 트 랜 잭 션 을 수행 합 니 다.프로그래머 에 게 는 바 텀 과정 에 전혀 관심 을 가지 지 않 고 PlatformTransactionManager 인터페이스 로 프로 그래 밍 을 하면 됩 니 다.PlatformTransactionManager 인터페이스 에서 다음 과 같은 방법 을 제공 합 니 다.getTransaction(..), commit(); rollback(); 이것들 은 모두 플랫폼 과 무관 한 사무 조작 입 니 다.getTransaction()의 전체 표기 법 은TransactionStatus getTransaction(TransactionDefinition definiton)이다.
이 방법 은 하나의 사무 대상 을 되 돌려 주 는 데 사 용 됩 니 다.그 중의 매개 변 수 는 TransactionDefinition 은 사무 대상 에 게 각종 속성 을 지정 할 수 있 습 니 다.보통 업무 의 격 리 속성,전파 속성,시간 초과,이 몇 가지 속성 만 읽 을 수 있 습 니 다.
Spring 의 구체 적 인 사무 관 리 는 프로필 에 PlatformTransactionManager 를 설정 해 야 합 니 다.다음은 서로 다른 유형의 사무 에 대응 하 는 Spring 설정 입 니 다.
JDBC 데이터 원본 의 국부 사무 관리자 설정 은 다음 과 같 습 니 다.

<!--      Bean,  C3P0     ,            -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSrouce"
    destroy-method="close"
    p:driverClass="com.mysql.jdbc.Driver"
    p:jdbcUrl="jdbc:mysql://localhost/test"
    p:user="root"
    p:password=""
    p:maxPoolSize="40"
    p:minPoolSize="2"
    p:initialPoolSize="2"
    p:maxIdleTime="30" />
  <!--   JDBC           ,  DataSourceTransactionManager  -->
  <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource" />
용기 관리의 JTA 전역 사무 관리자 설정 은 다음 과 같 습 니 다.

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" 
  p:jndiName="jdbc/jpetstore" />
<!--   JtaTransactionManager ,      PlatformTransactionManager   -->
<!--   JTA    ,Spring       Java EE           ,       -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
JTA 전역 트 랜 잭 션 에 대해 서 는 트 랜 잭 션 관리자 의 구현 클래스 인 JTaTransactionManager 만 지정 하면 됩 니 다.Spring 용 기 는 J2EE 서버 에서 데이터 원본 을 가 져 와 트 랜 잭 션 관리자 에 명시 적 으로 주입 하지 않 아 도 됩 니 다.
Hibernate 지구 화 기술 을 바탕 으로 하 는 Spring 국부 사무 설정 은 다음 과 같 습 니 다.

<!--      Bean,  C3P0     ,            -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSrouce"
    destroy-method="close"
    p:driverClass="com.mysql.jdbc.Driver"
    p:jdbcUrl="jdbc:mysql://localhost/test"
    p:user="root"
    p:password=""
    p:maxPoolSize="40"
    p:minPoolSize="2"
    p:initialPoolSize="2"
    p:maxIdleTime="30" />
  <!--   Hibernate SessionFactory, SessionFactory       ,  dataSource -->
  <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
    p:dataSource-ref="dataSource">
    <!-- annotatedClasses           -->  
    <property name="annotatedClasses">
      <list>
        <!--         PO  -->
        <value>com.entity.User</value>
      </list>
    </property>
    <!--   Hibernate sessionFactory   -->
    <property name="hibernateProperties">
      <props>
        <!--   Hibernate      -->
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
        <!--     Hibernate         -->
        <prop key="hibernate.hbm2ddl.auto">update</prop>
      </props>
    </property>
  </bean>
  <!--   Hibernate        ,  HibernateTransactionManager  -->
  <!--    PlatformTransactionManager    Hibernate      -->
  <!--   HibernateTransactionManager    sessionFactory -->
  <bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory" />
Spring 트 랜 잭 션 이 Hibernate 정책 을 사용 하려 면 데이터 원본,session Factory,트 랜 잭 션 관리자 세 가 지 를 설정 해 야 합 니 다.
만약 에 밑 에 Hibernate 지구 층 기술 을 사용 하고 업무 가 JTA 전역 사 무 를 사용 할 때 다음 과 같이 설정 합 니 다.

<!--   JTA   -->
  <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" 
    p:jndiName="jdbc/jpetstore" />
  <!--   Hibernate SessionFactory, SessionFactory       ,  dataSource -->
  <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
    p:dataSource-ref="dataSource">
    <!-- annotatedClasses           -->  
    <property name="annotatedClasses">
      <list>
        <!--         PO  -->
        <value>com.entity.User</value>
      </list>
    </property>
    <!--   Hibernate sessionFactory   -->
    <property name="hibernateProperties">
      <props>
        <!--   Hibernate      -->
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
        <!--     Hibernate         -->
        <prop key="hibernate.hbm2ddl.auto">update</prop>
      </props>
    </property>
  </bean>
  <!--   JtaTransactionManager ,   PlatformTransactionManager       -->
  <!--               -->
  <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
이 는 이전 Hibernate 기반 Spring 사무 에 비해 데이터 원본 을 JNDI 데이터 원본 으로 바 꾸 고 사무 관리 자 를 JtaTransactionManager 로 바 꾸 는 것 입 니 다.
JTA 전역 트 랜 잭 션 에 대해 서 는 바 텀 애플 리 케 이 션 서버 의 지원 이 필요 하기 때문에 애플 리 케 이 션 서버 가 제공 하 는 JTA 전역 트 랜 잭 션 에 디 테 일 한 차이 가 있 을 수 있 습 니 다.따라서 실제 전역 트 랜 잭 션 관리 자 를 설정 할 때 는 JTaTransactionManager 의 하위 클래스 를 사용 해 야 할 수 있 습 니 다.예 를 들 어 Oracle 자바 EE 애플 리 케 이 션 서버 가 제공 하 는 OC4JJTaTransactionManager 등 입 니 다.Oracle 이 WebLogic 에 제공 하 는 WebLogicJtaTransactionManager,IBM 이 WebSphere 에 제공 하 는 WebSphere Uow TransactionManager 등.
위의 각종 트 랜 잭 션 유형의 Spring 설정 을 통 해 알 수 있 듯 이 프로그램 이 Spring 트 랜 잭 션 관 리 를 사용 할 때 응용 프로그램 은 구체 적 인 트 랜 잭 션 API 와 결합 할 필요 가 없고 응용 프로그램 은 PlatormTransactionManager 인터페이스 프로 그래 밍 만 하면 됩 니 다.applicationContext 는 배치 파일 에 따라 적당 한 트 랜 잭 션 전략 실현 클래스(즉,PlatormTransactionManager 의 실현 클래스)를 선택 합 니 다.
그렇다면 구체 적 으로 Spring 에서 트 랜 잭 션 제어 프로 그래 밍 을 어떻게 하 는 지 는 보통 두 가지 방식 이 있다.
프로 그래 밍 식 사무 관리:바로 코드 에서 PlatormTransactionManager 가 제공 하 는 세 가지 추상 적 인 방법 으로 사무 절 차 를 제어 하 는 것 이다.또한 Spring 용기 에서 PlatormTransactionManager 유형의 Bean 을 가 져 올 수 있 습 니 다.이 Bean 은 항상 PlatormTransactionManager 의 구체 적 인 실현 류 의 인 스 턴 스 이 고 구체 적 인 실현 류 는 ApplicationContext 에서 전략 모델 에 따라 선택 합 니 다.프로그래머 들 은 관심 을 가지 지 않 고 인터페이스 프로 그래 밍 만 하면 됩 니 다.
성명 식 트 랜 잭 션 관리:트 랜 잭 션 제어 프로 세 스 를 코드 에 기록 하지 않 고 AOP 를 통 해 설정 파일 로 트 랜 잭 션 을 수행 하 는 방식 입 니 다.즉,XML 프로필 은 업무 구성 요소 에 사무 대 리 를 설정 할 수 있 고 사무 대 리 는 업무 구성 요소 에 사무 통 제 를 제공 할 수 있 습 니 다.현재 이런 방식 이 가장 좋 고 소스 코드 의 침입 성 이 가장 낮다.
성명 식 트 랜 잭 션 관리 사용-XML Schema 트 랜 잭 션 정책 사용
성명 식 사 무 를 사용 할 때 설정 파일 만 작성 하고 트 랜 잭 션 제어 가 필요 한 구성 요소 종 류 를 설정 하면 업무 구성 요 소 는 AOP 체제 에서 트 랜 잭 션 제어 로 짜 여 집 니 다.프로 그래 밍 자 는 트 랜 잭 션 관리 코드 를 쓰 지 않 아 도 업무 구성 요소 개발 에 전념 할 수 있 습 니 다.따라서 일반적으로 성명 식 사무 관 리 를 추천 합 니 다.
Spring 의 XML Schema 방식 은 간결 한 사무 설정 전략 을 제공 합 니 다.네 임 스페이스 <tx:advice> 를 통 해 하나의 사무 강화 처 리 를 설정 합 니 다.그 중에서 업무 의 각종 속성(예 를 들 어 격 리 속성,전파 속성,시간 초과,읽 기 속성 등)을 지정 할 수 있 습 니 다.그 다음 에탭 을 통 해 업무 의 강화 와 AOP 의 접점(즉,Bean 의 실행 방법)을 연결 시 켜 Bean 의 방법 을 사무 작업 에 삽입 할 수 있 습 니 다.다음은 간단 한 예 입 니 다.뉴스 DaoImpl bean 을 설정 하여 데이터 조작 을 하고 c3p 0 데이터 원본,Spring 의 JDBC 사무 관리 자 를 사용 하여완전한 Spring 설정 은 다음 과 같 습 니 다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:p="http://www.springframework.org/schema/p"
  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-4.0.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
  <!--      Bean,  C3P0     ,            -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"
    p:driverClass="com.mysql.jdbc.Driver"
    p:jdbcUrl="jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=UTF-8"
    p:user="root"
    p:password=""
    p:maxPoolSize="40"
    p:minPoolSize="2"
    p:initialPoolSize="2"
    p:maxIdleTime="30" />
  <!--   JDBC           ,  DataSourceTransactionManager  -->
  <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource" />
  
  <!--         Bean -->
  <bean id="newsDao" class="com.dao.impl.NewsDaoImpl" p:ds-ref="dataSource" />
  <!--         ,         -->
  <tx:advice id="txAdvice"
    transaction-manager="transactionManager">
    <!--             -->
    <tx:attributes>
      <!--    get           -->
      <tx:method name="get*" read-only="true" />
      <!--            ,    5  -->
      <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="5" />
    </tx:attributes>
  </tx:advice>
  <aop:config>
    <!--        ,  impl     impl              -->
    <aop:pointcut expression="execution(* com.dao.impl.*Impl.*(..))" id="myPointcut" />
    <!--     myPointcut   txAdvice  -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
    <!--         ,  impl     abc             -->
  </aop:config>
</beans>
뉴스 DaoImpl 코드 에 중복 데 이 터 를 표 에 삽입 합 니 다.

package com.dao.impl;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import com.dao.NewsDao;
public class NewsDaoImpl implements NewsDao {
	private DataSource ds;
	public void setDs(DataSource ds) {
		this.ds = ds;
	}
	@Override
	  public void insert(String title, String content) {
		//c3p0      
		JdbcTemplate jt = new JdbcTemplate(ds);
		jt.update("insert into news_inf" + " values(100,?,?)", title, content);
		jt.update("insert into news_inf" + " values(100,?,?)", title, content);
		//        ,           
		//        ,             
	}
}
다음은 테스트 방법,

public static void test3() {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans4JDBC.xml");
    //      Bean
    NewsDao dao = (NewsDao)ctx.getBean("newsDao", NewsDao.class);
    dao.insert("java      ", "   Java EE  ");
    System.out.println("    ");
  }
테스트 방법 을 실행 하면 이상 을 던 지 는 것 을 발견 할 수 있 으 며,트 랜 잭 션 제어 로 인해 데이터 베 이 스 는 삽입 되 지 않 습 니 다.
위의 예 에서 볼 수 있 듯 이 XML Schema 에 대한 설정 은 보통 Bean 에 AOP 설정 을 하고 advice 를 짜 서 강화 하 는 것 입 니 다.advice 강화 에 서 는 사무 관리 자 를 설정 하고 사무 관리 자 는 데이터 원본 에 의존 합 니 다.
에 서 는 advice 와 접점 을 연결 합 니 다.Spring 바 텀 은 Bean 후 프로세서 로 이 루어 집 니 다(예 를 들 어 Bean NameAutoProxyCreator,Default Advisor AutoProxyCreator).그 본질은 동적 에이전트 입 니 다.
또한설정 강화 에 서 는 트 랜 잭 션 에 특정 이상 이 발생 했 을 때 강제 rollback 과 강제 불 rollback,즉 rollback-for="xxxException",no-rollback-for="xxxException"을 지정 할 수 있 습 니 다.
@Transactionl 사용 하기
XML Schema 를 사용 하 는 방법 외 에 도 방법 에@Transaction 주 해 를 직접 추가 하여 이 방법 이 사무 속성 을 가지 도록 할 수 있 습 니 다.@Transaction 에 서 는 트 랜 잭 션 에 다양한 속성(예 를 들 어 격 리 속성,전파 속성,시간 초과,속성 만 읽 기 등)을 설정 할 수 있 습 니 다.또한 XML 설정 에 <tx:annotation-driven transaction-manager="transactionManager" />NewsDaoImpl.

@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT, timeout=5)
@Override
public void insert(String title, String content) {
총결산
이상 은 본 논문 에서 Spring 의 사무 체제 인 스 턴 스 코드 에 관 한 모든 내용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사이트 의 다른 관련 주 제 를 계속 참고 할 수 있 습 니 다.부족 한 점 이 있 으 면 댓 글로 지적 해 주 십시오.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기