최근 Spring의 JDBCTemplete의 템플릿 메소드를 보았을 때 템플릿과 콜백에 관심이 많았으며 몇 가지 정보를 쿼리하고 요약했습니다.
콜백 함수 :
소위 콜백은 클라이언트 프로그램 C가 서비스 프로그램에서 특정 함수 A를 호출 한 다음 S는 어느 시간에 C에서 특정 함수 B를 호출 함을 의미합니다. C의 경우이 B를 콜백 함수라고합니다. 콜백 함수는 콜백 함수 호출 규칙에 따라 사용자가 구현 한 함수 일뿐입니다. 콜백 함수는 워크 플로의 일부이며 워크 플로우는 함수 통화 타이밍 (콜백)을 결정합니다. 일반적으로 C는 B를 자체적으로 호출하지 않습니다. B를 제공하는 C의 목적은 S라고 부르며 C는 그것을 제공해야합니다. S는 B의 이름을 CONE에 대해 알지 못하므로 S는 B의 인터페이스 사양 (함수 프로토 타입)에 동의하며, C는 S의 함수 R을 통해 B 기능을 사용한다고 미리 알려줍니다.이 프로세스는 콜백 함수의 등록이라고하며 R은 등록 기능이라고합니다. 웹 서비스 및 Java RMI는 콜백 메커니즘을 사용하여 원격 서버 프로그램에 액세스합니다. 콜백 함수에는 다음 특성이 포함됩니다.
1. 워크 플로의 일부에 속합니다.
2. 워크 플로에 의해 지정된 통화 규칙에 따라 선언되어야한다.
3. 호출 타이밍은 워크 플로에 의해 결정됩니다. 콜백 함수의 구현자는 콜백 함수를 직접 호출하여 워크 플로의 함수를 구현할 수 없습니다.
콜백 메커니즘 :
콜백 메커니즘은 일반적인 디자인 모델입니다. 합의 된 인터페이스에 따라 워크 플로의 기능을 외부 사용자에게 노출 시키거나 외부 사용자에게 데이터를 제공하거나 외부 사용자가 데이터를 제공하도록 요구합니다.
자바 콜백 메커니즘 :
소프트웨어 모듈 간에는 항상 특정 인터페이스가 있습니다. 통화 방법과 관련하여 동기 호출, 콜백 및 비동기 통화의 세 가지 범주로 나눌 수 있습니다.
동기 호출 : 차단 통화, 발신자는 상대방이 반환하기 전에 실행을 완료 할 때까지 기다려야합니다. 일방 통화입니다.
콜백 : 두 방향 호출 모드, 즉 전화 당사자는 인터페이스를 호출 할 때 다른 당사자의 인터페이스를 호출합니다.
비동기 호출 : 메시지 나 이벤트와 유사한 메커니즘이지만 호출 방향은 그 반대입니다. 인터페이스 서비스가 특정 메시지를 수신하거나 이벤트가 발생하면 클라이언트에게 적극적으로 알립니다 (즉, 클라이언트의 인터페이스에 전화하십시오).
콜백과 비동기 통화 사이의 관계는 매우 밀접한 관련이 있습니다. 콜백은 비동기 메시지 등록을 구현하는 데 사용되며 비동기 호출을 통해 메시지 알림이 달성됩니다.
콜백 인스턴스
1. 콜백 인터페이스
공개 인터페이스 콜백 {String Callback (); } 2. 발신자
공개 클래스 또 다른 {개인 콜백 콜백; // 클래스 공개 void SetCallback (Callback Callback)을 구현하는 메소드 호출 {this.callback = 콜백; } // 비즈니스가 필요할 때 클래스 공개 void docallback ()를 구현하는 특정 방법을 호출하십시오. }} 3. 테스트 콜백 함수
public class testcallcack {public static void main (string [] args) {// 발신자의 구현 클래스를 만듭니다. // 뒷면 인터페이스를 구현 클래스에 등록합니다. // 콜백 함수를 실행합니다. }}콜백 방법의 사용은 일반적으로 "Java 인터페이스"및 "Abstract Class"를 사용하는 동안 발생합니다. 템플릿 메소드 설계 패턴은 메소드 콜백 메커니즘을 사용합니다. 이 패턴은 먼저 특정 단계의 알고리즘 골격을 정의하고 서브 클래스에서 구현 된 설계 패턴으로 몇 단계를 지연시킵니다. 템플릿 메소드 설계 패턴을 통해 서브 클래스는 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 특정 단계를 재정의 할 수 있습니다.
템플릿 디자인 패턴의 적용 가능성 :
1. 한 번에 알고리즘의 변하지 않는 부분을 구현하고 변수 알고리즘을 서브 클래스로 두어 구현하십시오.
2. 각 서브 클래스의 공개 행동은 코드 복제를 피하기 위해 공개 부모 클래스에 추출하고 집중해야합니다.
3. 서브 클래스 확장을 제어 할 수 있습니다.
템플릿 예 :
추상 템플릿 메소드 클래스 :
공개 초록 클래스 초록 업 {// 서브 클래스 구현이 필요한 메소드 공개 추상 void print (); // 템플릿 메소드 public void doprint () {system.out.println ( "execute 템플릿 메소드"); for (int i = 0; i <3; i ++) {print (); }}} 서브 클래스 구현 템플릿 메소드 클래스 :
공개 클래스 서브 클래스는 AbstractSup {@override public void print () {System.out.println ( "하위 클래스의 구현 방법")을 확장합니다. }} 템플릿 방법 테스트 클래스 :
public class templeteTest {public static void main (String [] args) {서브 클래스 서브 클래스 = new subclass (); subclass.print (); subclass.doprint (); }} 다음은 스프링 템플릿 방법의 사용에 대한 자세한 소개입니다. JDBCTemplete를 예로 들어 템플릿 모드 및 콜백 메커니즘의 사용에 대해 자세히 설명합니다.
먼저, 클래식 JDBC 프로그래밍 예를 살펴 보겠습니다.
공개 목록 <user> query () {list <user> userList = new ArrayList <user> (); 문자열 sql = "select * from user"; 연결 con = null; 준비된 상태 pST = null; resultSet rs = null; try {con = hsqldbutil.getConnection (); pst = con.preparestatement (SQL); rs = pst.executeQuery (); 사용자 user = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ( "id")); user.setusername (rs.getstring ( "user_name")); user.setbirth (rs.getDate ( "birth")); user.setcreatedate (rs.getDate ( "create_date")); userList.Add (사용자); }} catch (sqlexception e) {e.printstacktrace (); } 마침내 {if (rs! = null) {try {rs.close (); } catch (sqlexception e) {e.printstacktrace (); }} try {pst.close (); } catch (sqlexception e) {e.printstacktrace (); } try {if (! con.isclosed ()) {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }} return userList; }
간단한 쿼리에는 그러한 많은 것들이 필요하며 예외를 다루는 것도 필요합니다. 우리가 원하지 않는다면 정리해 봅시다.
1. 연결을 얻으십시오
2. 진술을 얻으십시오
3. 결과 세트를 얻습니다
4. 결과 세트를 반복하여 컬렉션으로 캡슐화하십시오.
5. 연결, 진술 및 결과 세트를 차례로 닫고 다양한 예외를 고려하십시오.
여러 쿼리가 더 중복 코드를 생성하면 템플릿 메커니즘을 사용할 수 있습니다. 관찰을 통해, 우리는 위의 단계 중 대부분이 반복적이고 재사용 가능하다는 것을 발견했습니다. 각 테이블은 다른 자바 콩을 매핑하기 때문에 결과 세트를 가로 지르고 컬렉션에 캡슐화 할 때만 사용자 정의 할 수 있습니다. 코드 의이 부분을 재사용 할 수있는 방법은 없으며 사용자 정의 할 수 있습니다.
추상 수업 코드 :
공개 초록 클래스 jdbctemplate {// 템플릿 메소드 공개 최종 개체 실행 (String SQL)은 sqlexception {Connection con = hsqldbutil.getConnection (); 문자 stmt = null; try {stmt = con.createstatement (); resultSet rs = stmt.executeQuery (SQL); 객체 결과 = doinstatement (RS); // 초록 방법 (사용자 정의 방법, 서브 클래스 구현 필요) 리턴 결과; } catch (sqlexception ex) {ex.printstacktrace (); ex 던지기; } 마침내 {try {stmt.close (); } catch (sqlexception e) {e.printstacktrace (); } try {if (! con.isclosed ()) {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }}} // 초록 메소드 (사용자 정의 메소드) 보호 된 추상 개체 doinstatement (resultSet rs); }이 추상 클래스에서, Sun JDBC API의 주요 과정이 캡슐화되고, 결과 세트를 가로 지르는 단계는 서브 클래스에 의해 구현되는 추상 방법 Doinstatement ()에 배치됩니다.
서브 클래스 구현 코드 :
공개 클래스 JDBCTEMPLATEUSERIMPL은 JDBCTEMPLATE를 확장합니다. {@Override Protected Object Doinstatement (resultSet rs) {list <user> userList = new ArrayList <User> (); {user user = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ( "id")); user.setusername (rs.getstring ( "user_name")); user.setbirth (rs.getDate ( "birth")); user.setcreatedate (rs.getDate ( "create_date")); userList.Add (사용자); } return userList; } catch (sqlexception e) {e.printstacktrace (); 널 리턴; }}}doinstatement () 메소드에서 결과 세트를 통과하고 마지막으로 반환합니다.
테스트 코드 :
문자열 sql = "select * from user"; jdbctemplate jt = 새로운 jdbctemplateuserimpl (); List <user> userList = (list <user>) JT.Execute (SQL);
템플릿 메커니즘은 지금까지 사용되었지만 jdbctemplate을 호출 할 때마다 상위 클래스를 상속 해야하는 경우 매우 불편하므로 콜백 메커니즘이 역할을 수행 할 수 있습니다.
소위 콜백은 메소드 매개 변수에서 인터페이스를 전달하는 것을 의미합니다. 상위 클래스 가이 메소드를 호출하면 메소드에 전달 된 인터페이스의 구현 클래스를 호출해야합니다.
콜백 플러스 템플릿 모드 구현
콜백 인터페이스 :
public interface stationcallback {개체 doinstatement (stration stmt)는 sqlexception을 던졌습니다. } 템플릿 방법 :
공개 클래스 jdbctemplate {// 템플릿 메소드 공개 최종 개체 실행 (stationcallback action) sqlexception {connection con = hsqldbutil.getConnection (); 문자 stmt = null; try {stmt = con.createstatement (); 객체 결과 = action.doinstatement (RS); // 콜백 메소드 리턴 결과; } catch (sqlexception ex) {ex.printstacktrace (); ex 던지기; } 마침내 {try {stmt.close (); } catch (sqlexception e) {e.printstacktrace (); } try {if (! con.isclosed ()) {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }}}} public object query (stationcallback stmt) sqlexception {return execute (stmt); }}} 테스트 수업 :
공개 객체 쿼리 (Final String SQL)는 sqlexception {class QueryStatementCallback emplementsCallback {public object doinstatement (station stmt)를 sqlexception {resultSet rs = stmt.executeQuery (SQL); List <user> userList = new ArrayList <user> (); 사용자 user = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ( "id")); user.setusername (rs.getstring ( "user_name")); user.setbirth (rs.getDate ( "birth")); user.setcreatedate (rs.getDate ( "create_date")); userList.Add (사용자); } return userList; }} jdbctemplate jt = new jdbctemplate (); return jt.query (new QueryStatementCallback ()); }
Spring이 기존 템플릿 방법을 사용하지 않고 콜백과 협력하는 이유는 무엇입니까?
부모 클래스에 10 가지 추상 방법이 있다면 상속하는 모든 서브 클래스 가이 10 가지 추상 방법을 모두 구현 해야하는 경우 하위 클래스가 매우 부풀어 오른 것으로 보인다. 때때로, 서브 클래스가 부모 클래스에서 특정 메소드를 사용자 정의하기 만하면 어떻게해야합니까? 현재 콜백이 사용됩니다.
또한 위의 방법은 기본적으로 템플릿 메소드 + 콜백 모드를 구현합니다. 그러나 그것은 여전히 Spring의 jdbctemplate에서 조금 멀다. 위의 템플릿 메소드 + 콜백 모드를 구현했지만 Spring의 jdbctemplate과 비교하여 약간 "추악한"것 같습니다. Spring은 RowMapper 및 ResultesTextractor의 개념을 소개합니다. RowMapper 인터페이스는 특정 행의 데이터를 처리 할 책임이 있습니다. 예를 들어, Maprow 메서드의 특정 레코드 행에서 작동하거나 엔티티로 캡슐화 할 수 있습니다. resultestextractor는 데이터 세트 추출기로, RowMapper의 규칙에 따라 결과 세트를 통과하고 데이터를 처리하는 데 책임이 있습니다. RowMapper와 ResultSetExtractor의 차이점은 RowMapper가 특정 행을 처리하고 엔티티 객체를 반환한다는 것입니다. resultestextractor는 데이터 세트를 처리하고 객체 모음을 반환합니다.
물론, 위는 스프링 jdbctemplate 구현의 기본 원칙 일뿐입니다. Spring JDBCTemPlate은 모든 기본 작업을 JDBCOPERATIONS 인터페이스에 캡슐화하고 JDBCACCESSOR를 사용하여 데이터 소스 및 변환 예외를 관리하는 등 더 많은 작업을 수행했습니다.
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.