2014-09-23 2 views
6

여러 JavaConfig 컨텍스트의 경우에 @EnableTransactionManagement 주석을 넣을 수있는 곳이 어디인지 이해하려고합니다.@EnableTransactionManagement의 범위는 무엇입니까?

다음 시나리오를 고려하십시오. 서비스 빈 집합과 함께 JPAConfig.java 및 AppConfig.java에 JPA 구성이 있습니다. 그런 다음 RootConfig.java에서 전체 응용 프로그램 구성을 작성합니다.

JPAC 저장소에 대한 검색을 활성화 할뿐만 아니라 JPAConfig.java 내에 트랜잭션 관리자를 정의합니다. 트랜잭션 동작을 나타내는 것으로서 JPAConfig에 @EnableTransactionManagement을 입력하면 작동합니다.

그러나 일부 서비스 빈도 트랜잭션 방식을 가질 필요가 있습니다. 단일 트랜잭션 내에서 여러 리포지토리에 액세스합니다. 또한 @EnableTransactionManagement을 AppConfig에 추가해야합니까? 이 주석의 구현을 들여다 보면 이러한 접근 방식이 일부 콩의 재정의를 유발할 것으로 생각됩니다. 실제로 그렇게하는 것은 저에게 효과적이지 않습니다.

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories("com.mypackage.repositories") 
public class JPAConfig { 
// ... here are EntityManager and PlatformTransactionManager beans 
} 


@Configuration 
@ComponentScan("com.mypackage.services") 
// @EnableTransactionManagement // - ??? 
public class AppConfig { 
} 

@Configuration 
@Import({AppConfig.class, JPAConfig.class}) 
public class RootConfig { 
} 

모든 조언을 감사하십시오. 나는 것 몇 가지 실험 후

+1

이 주석은 트랜잭션 관리 작업을 전체 응용 프로그램 컨텍스트에 추가합니다. 그것이 그 범위입니다. –

+1

그러나 전체 RootConfig에 대해 트랜잭션 주석 처리를 사용하는 것으로 보이지는 않습니다. 적어도, 그것은 나를 위해 작동하지 않습니다. –

답변

10

대답을 자신을 발견합니다 :

  • 그것은 등록으로이 주석이 발견 아무리 일찍는하지만 상황에 맞는 구성의 각 조각에 @EnableTransactionManagement을 구성 할 필요가 없습니다 internalTransactionAdvisor 실제로 생성 된 빈에 대해 @Transactional 주석을 처리합니다.
  • 필자의 경우 문맥 순서를 @Import 선언으로 변경 했으므로 은 PersistenceConfig이고 @EnableTransactionManagement은 먼저 입니다. 다른 조각 에서이 콩 후 AOP 선언 거래를 사용할 수 있습니다.
  • 또 다른 경고는 @EnableTransactionManagement@EnableGlobalMethodSecurity의 동시 사용과 관련됩니다. 전역 메소드 보안은 전체 보안 구성을 유선으로 요구하는 것으로 보이는 bean 포스트 프로세싱을 사용합니다. BeanPostProcessors는 컨텍스트 시작시에 일찍 만들어 지므로 봄 보안을 부트 스트랩하는 데 필요한 bean에 선언문 @Transactional을 사용할 수 없습니다 (내 경우 UserDetailsContextMapper) - 관리자가 아직 작성되지 않았습니다!
+0

스프링 보안 구성을 사용하여 트랜잭션을 가져 오는 방법은 무엇입니까? – Tarator

+0

지금은 오래되었습니다. :) 기억하는 한, 방금 프로그래밍 방식으로 거래가 끝났습니다. 그런 솔루션이 나에게 잘 맞았을 때 정말 필요한 장소였습니다. –