@Transactional 어노테이션에 붙은 클래스는 무엇이었습니다.

6360 단어 springframeworkspring

@Transactional 어노테이션에 붙은 클래스, 프록시 클래스를 만들었다



게시판 샘플 애플리케이션 를 보고, 클래스 info.saladlam.example.spring.noticeboard.service.MessageServiceImpl에 @Transactional 어노테이션이 붙었다. BeanFactory는 이 클래스를 처리해, org.springframework.transaction.interceptor.TransactionInterceptor가 붙인 프록시 클래스를 만들었다. 아래 다이어그램은 Eclipse 디버거에서 실제 MessageService 인스턴스를 보여줍니다.



TransactionInterceptor의 역할


  • 트랜잭션의 개시와 종료의 의도가 PlatformTransactionManager 인스턴스에 전하는 것
  • 예외 처리

  • 아래 코드는 메서드 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(Method, Class, InvocationCallback)의 일부입니다.
    // ...
            // If the transaction attribute is null, the method is non-transactional.
            TransactionAttributeSource tas = getTransactionAttributeSource();
            final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null);
            final org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(Method, Class<?>, InvocationCallback) tm = determineTransactionManager(txAttr);
            final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);
    
            if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
                // Standard transaction demarcation with getTransaction and commit/rollback calls.
                TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
    
                Object retVal;
                try {
                    // This is an around advice: Invoke the next interceptor in the chain.
                    // This will normally result in a target object being invoked.
                    retVal = invocation.proceedWithInvocation();
                }
                catch (Throwable ex) {
                    // target invocation exception
                    completeTransactionAfterThrowing(txInfo, ex);
                    throw ex;
                }
                finally {
                    cleanupTransactionInfo(txInfo);
                }
                commitTransactionAfterReturning(txInfo);
                return retVal;
            }
    // ...
    

    프로그램이
    retVal = invocation.proceedWithInvocation();
    

    실행할 때 info.saladlam.example.spring.noticeboard.service.MessageServiceImpl의 메서드가 호출됩니다.

    PlatformTransactionManager의 역할



    Spring Framework의 컨텍스트에서 싱글 톤 PlatformTransactionManager 인스턴스가 있습니다. 여기에 나타낸 샘플 어플리케이션은 org.springframework.jdbc.datasource.DataSourceTransactionManager라고 하는 실작. 이 인스턴스는 모든 트랜잭션에 대한 청구를 처리합니다.

    좋은 웹페이지 즐겨찾기