인라인 메소드를 정의하는 Data 인터페이스에는 Connection 오브젝트에 대한 여러 가지 JDBC 메소드(예: close(), commit(), rollback(), setAutoCommit() 및 getAutoCommit())가 포함되어 있습니다. 이러한 메소드를 pre() 및 post() 메소드로 분류할 수 없습니다.
예를 들어, sendFormLetter() 어노테이션이 있는 메소드에는 사용할 동문 편지를 식별하는 코드를 제공하는 int 매개변수가 있습니다. 이 메소드에는 또한 동문 편지에 입력할 정보 및 동문 편지를 보내기 위한 도시, 주 및 우편번호를 제공하는 String 매개변수가 있습니다. 마지막으로 sendFormLetter() 메소드는 편지를 인쇄하고 보내야 하는지 여부를 추적하는 테이블을 갱신합니다.
sendFormLetter() 메소드를 호출하는 애플리케이션이 도시, 주 또는 우편번호를 제공하지 않거나 이 중 두 가지는 제공하지만 세 가지를 모두 제공하지는 않을 수 있다고 가정하십시오. 세 값이 모두 존재하는지 점검하는 애플리케이션 논리를 작성하려고 하지만 데이터베이스에서 이를 쉽게 수행할 수 없고 sendFormLetter() 메소드의 정의에서 수행할 수 없습니다. 해당 애플리케이션 논리를 작성할 수 있는 한 위치는 다음과 같이 정의할 수 있는 Hook입니다.
import com.ibm.pdq.runtime.statement.*; 1 public class ZipHook implements Hook { public void pre ( 2 String methodName, Data dataInstance, SqlStatementType sqlStatementType, Object... parameters) { if (methodName.startsWith( "sendFormLetter(int, java.lang.String")) { // right method; params 2,3, & 4 are city, state, zip if (parameters[1] == null || parameters[2] == null || parameters[3] == null) { ... 3 } } } public void post ( 4 String methodName, Data dataInstance, Object returnValue, SqlStatementType sqlStatementType, Object... parameters) { return; // no action } }
sendFormLetter() 메소드가 com.company.NotSpam 인터페이스에 정의된 경우, Hook ZipHook의 인스턴스를 sendFormLetter() 메소드의 사용과 연관시키는 애플리케이션 논리는 다음과 같을 수 있습니다.
Connection con = DriverManager.getConnection(...); 1 ZipHook zHook = new ZipHook(); 2 Data db = DataFactory.getData(NotSpam.class, con, zHook); 3
위 코드에서 수행하는 단계는 다음과 같습니다.