스프링 템 플 릿 모드 (템 플 릿 + 콜백)

이전에 을 보 았 을 때 Spring 처리 데이터 뱅 크 의 정수 류 인 JdbcTemplate 를 발 견 했 습 니 다. 이 는 템 플 릿 의 디자인 모델 을 사용 하여 데이터 뱅 크 연결 의 획득, 데이터 뱅 크 연결 의 닫 기 등 절 차 를 고정 시 킨 다음 에 변 화 된 부분 을 하위 클래스 나 리 셋 함수 에 의 해 이 루어 집 니 다.예전 에 접촉 한 것 은 모두 추상 적 인 아버지 류 성명 절차 이 고 절차 에는 추상 적 인 함수 가 포함 되 어 있 으 며 자 류 는 아버지 류 를 계승 하고 아버지 류 의 추상 적 인 함 수 를 실현 했다. 그러면 아버지 류 의 절차 라 는 절 차 는 변 하지 않 고 서브 류 의 추상 적 인 방법의 실현 일 뿐이다.그러나 이 기 초 는 계승 이다. 만약 에 변화 하 는 부분 이 너무 많 으 면 여러 가지 유형 을 실현 해 야 한다. 그리고 아버지 류 의 절차 가 여러 가지 가 있다 면 그 자 류 는 자신 이 필요 로 하지 않 는 추상 적 인 함 수 를 실현 해 야 한다. 이것 은 단점 이다.Spring 은 몇 개의 * Template 클래스 에서 리 셋 함 수 를 사용 합 니 다. 예 를 들 어 다음은 JdbcTemplate 의 방법 입 니 다. 
 public  T execute(StatementCallback action) throws DataAccessException {
        Assert.notNull(action, "Callback object must not be null");
        Connection con = DataSourceUtils.getConnection(this.getDataSource());
        Statement stmt = null;

        Object var7;
        try {
            Connection conToUse = con;
            if (this.nativeJdbcExtractor != null && this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
                conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
            }

            stmt = conToUse.createStatement();
            this.applyStatementSettings(stmt);
            Statement stmtToUse = stmt;
            if (this.nativeJdbcExtractor != null) {
                stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
            }

            T result = action.doInStatement(stmtToUse);
            this.handleWarnings(stmt);
            var7 = result;
        } catch (SQLException var11) {
            JdbcUtils.closeStatement(stmt);
            stmt = null;
            DataSourceUtils.releaseConnection(con, this.getDataSource());
            con = null;
            throw this.getExceptionTranslator().translate("StatementCallback", getSql(action), var11);
        } finally {
            JdbcUtils.closeStatement(stmt);
            DataSourceUtils.releaseConnection(con, this.getDataSource());
        }

        return var7;
    }

이 매개 변 수 는 StatementCallback action 으로 CallBack 으로 끝 나 는 것 을 발견 할 수 있 습 니 다. 이것 은 인터페이스 이 고 인터페이스 가 하나의 방법 을 정 의 했 습 니 다. 이 방법 은 바로 절차 에 의 해 호출 된 것 입 니 다.
package org.springframework.jdbc.core;
import java.sql.SQLException; import java.sql.Statement; import org.springframework.dao.DataAccessException;
public interface StatementCallback {     T doInStatement (Statement var 1) throws SQL Exception, DataAccessException;} 자신의 필요 한 방법 을 계승 하고 실현 하면 됩 니 다. 이렇게 여러 절차 에서 필요 하지 않 은 방법 을 실현 할 필요 가 없습니다.이 밖 에 도 두 가지 유사 한 유형 이 발견 되 었 다. 트 랜 잭 션 템 플 릿 과 redis 를 처리 하 는 RedisTemplate 는 모두 비슷 한 방식 을 사용 했다.예 를 들 어 전자:
public  T execute(TransactionCallback action) throws TransactionException {
        if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
            return ((CallbackPreferringPlatformTransactionManager)this.transactionManager).execute(this, action);
        } else {
            TransactionStatus status = this.transactionManager.getTransaction(this);

            Object result;
            try {
                result = action.doInTransaction(status);
            } catch (RuntimeException var5) {
                this.rollbackOnException(status, var5);
                throw var5;
            } catch (Error var6) {
                this.rollbackOnException(status, var6);
                throw var6;
            } catch (Throwable var7) {
                this.rollbackOnException(status, var7);
                throw new UndeclaredThrowableException(var7, "TransactionCallback threw undeclared checked exception");
            }

            this.transactionManager.commit(status);
            return result;
        }
    }

 
package org.springframework.transaction.support;

import org.springframework.transaction.TransactionStatus;

public interface TransactionCallback {
    T doInTransaction(TransactionStatus var1);
}

     :

package org.springframework.transaction.support;

import org.springframework.transaction.TransactionStatus;

public abstract class TransactionCallbackWithoutResult implements TransactionCallback {
    public TransactionCallbackWithoutResult() {
    }

    public final Object doInTransaction(TransactionStatus status) {
        this.doInTransactionWithoutResult(status);
        return null;
    }

    protected abstract void doInTransactionWithoutResult(TransactionStatus var1);
}

다음은 호출 된 코드 세 션 입 니 다:
int propagation = newTxRequired ? 3 : 0; TransactionAttribute transactionAttribute = TestContextTransactionUtils.createDelegatingTransactionAttribute(testContext, new DefaultTransactionAttribute(propagation)); (new TransactionTemplate(transactionManager, transactionAttribute)).execute(new TransactionCallbackWithoutResult() {    public void doInTransactionWithoutResult(TransactionStatus status) {              populator.execute(dataSource);    }  }); 익명 내부 클래스 를 사용 하지만, 이 CallBack 클래스 는 대부분 함수 식 인터페이스 이 며, 이후 에는 Lambda 표현 식 을 사용 하여 구현 할 수 있 습 니 다.
추가, 또 하나의 유사 한 것 을 발견 했다. spring - jms 의 JmsTemplate 와 그 중의 eecute 방법 은 * Callback 의 인 터 페 이 스 를 볼 때 구체 적 인 실현 을 보고 싶다 면 대부분 익명 내부 류 이다. 예 를 들 어 Session Callback:
이 1, 2... 모두 익명 의 내부 유형 입 니 다. 예 를 들 어:
public T execute(final Destination destination, final ProducerCallback action) throws JmsException {         Assert.notNull(action, "Callback object must not be null");         return this.execute(new SessionCallback() {             public T doInJms(Session session) throws JMSException {                 MessageProducer producer = JmsTemplate.this.createProducer(session, destination);
                Object var3;                 try {                     var3 = action.doInJms(session, producer);                 } finally {                     JmsUtils.closeMessageProducer(producer);                 }
                return var3;             }         }, false);     } ———————————————— 저작권 성명: 본 고 는 CSDN 블 로 거 '작은 칠' 의 오리지널 글 입 니 다. CC 4.0 BY - SA 저작권 협의 에 따라 원문 출처 링크 와 본 성명 을 첨부 하 십시오.https://blog.csdn.net/a_842297171/article/details/81746307

좋은 웹페이지 즐겨찾기