6.5 간결한 프록시 정의 by sh

6.5. 간결한 프록시 정의

특히 트랜잭션 프록시를 정의 할 때, 많은 유사한 프록시 정의로 끝날 수 있습니다. 부모 bean 정의와 자식 bean 정의를 inner bean 정의와 함께 사용하면 훨씬 명확하고 간결한 proxy 정의가 될 수 있습니다.

먼저 다음과 같이 프록시에 대한 부모, 템플릿, bean 정의를 작성합니다.

<bean id="txProxyTemplate" abstract="true"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributes">
        <props>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

TransactionProxyFactoryBean : 트랜잭션을 처리하는 프록시를 생성해주는 클래스

  • 프로퍼티 목록

    • transactionManager : 트랜잭션 관리자 설정

    • transactionAttributes : 트랜잭션 속성을 설정할 때 사용되는 Properties 객체를 설정

      • key : 트랜잭션을 적용할 메서드 이름을 설정

      • <prop> 태그 값 형식 : PROPAGATION_NAME, ISOLATION_NAME, readOnly, timeout, +Exception1, -Exception2

        • PROPAGATION_NAME (필수항목) : 트랜잭션 전파 규칙

        • ISOLATION_NAME : 트랜잭션 격리 레벨

        • readOnly : 트랜잭션을 읽기 전용으로 설정

        • timeout : 트랜잭션의 타임 아웃 시간을 초 단위로 설정

        • 롤백 규칙 : +, -를 사용하여 설정.

          • + : 해당 예외가 발생하더라도 커밋 수행

          • - : 롤백 수행

        [참고사이트] http://blog.naver.com/PostView.nhn?blogId=tyboss&logNo=70035299782&redirect=Dlog&widgetTypeCall=true

이것은 결코 인스턴스화되지 않으므로 실제로 불완전 할 수 있습니다. 그런 다음, 생성되어야하는 각 프록시는 자식 빈 정의이며, 프록시의 대상을 내부 빈 정의로 래핑합니다. 대상은 결코 자체적으로 사용되지 않기 때문입니다. 다음 예제는 그러한 하위 bean을 보여줍니다.

<bean id="myService" parent="txProxyTemplate">
    <property name="target">
        <bean class="org.springframework.samples.MyServiceImpl">
        </bean>
    </property>
</bean>

부모 템플릿에서 속성을 재정의 할 수 있습니다. 다음 예제에서는 트랜잭션 전파 설정을 재정의합니다.

<bean id="mySpecialService" parent="txProxyTemplate">
    <property name="target">
        <bean class="org.springframework.samples.MySpecialServiceImpl">
        </bean>
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="store*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

부모 bean 예제에서 우리는 앞서 설명 된 것처럼 abstract속성을 true로 설정하여 부모 Bean 정의를 추상으로 명시 했으므로 실제로 인스턴스화되지 않을 수 있습니다. 애플리케이션 컨텍스트 (단순 bean 팩토리는 제외)는 기본적으로 모든 싱글 톤을 미리 인스턴스화합니다. 따라서 최소한 (싱글 톤 bean의 경우) 템플릿으로만 사용하려는 (상위) Bean 정의가 있고 이 정의가 클래스를 지정하는 경우, abstract속성을 다음과 같이 true로 설정해야합니다. 그렇지 않으면 응용 프로그램 컨텍스트가 실제로 사전 인스턴스화를 시도합니다.

txProxyTemplate 빈은 abstract = "true"로 설정되어 직접적으로 사용 불가능!

실질적으로 트랜잭션을 처리하는 컴포넌트들에서 이 빈을 사용한다.

Last updated