스프링 템 플 릿 모드 (템 플 릿 + 콜백)
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
다음은 호출 된 코드 세 션 입 니 다:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.