예제 - 새로운 메소드가 1.7의 javax.sql.CommonDataSource에 추가되었습니다.




spring datasource class (2)

자바 1.7에 대해 내 애플 리케이션을 컴파일하려고 노력했다. 거기에 새로운 메소드가 javax.sql.CommonDataSource (그리고 jsDataSource에서)에 추가 된 것을 발견했다. getParentLogger() . CommonDataSource:1.7CommonDataSource:1.6 비교할 수 있습니다 CommonDataSource:1.6

나를 위해이 변경 확실히 이전 버전과의 호환성을 깰. 예를 들어, 내 응용 프로그램 (DataSource의 구현 포함)은 코드 변경없이 1.7에 대해 컴파일하지 않습니다.

내 의견으로는,이 일을하는 것은 매우 강력한 이유가되어야합니다. 그러나 나는 심지어 하나도 할 수 없습니다. 누군가가이 변화의 추론을 설명 할 수 있습니까? 그것이 올바르게 다루어 져야하는 방법 - 나에게있어서 자바에 대한 역 호환성을 처음으로 만났기 때문에 여기에 "모범 사례"가 없다.


Java 7 용 응용 프로그램 컴파일을 지원할 준비가되지 않은 경우 Java 7 컴파일러를 사용하여 Java 1.6 용으로 계속 컴파일 할 수 있습니다. Java 1.6 런타임 환경 (또는 SDK)이 설치되어 있어야합니다. Java 7 컴파일러를 사용하여 스텁 된 DataSource 를 구현하는 MyDataSource.java 클래스를 컴파일하려고하면 다음이 표시 될 수 있습니다.

$ java -version 
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Server VM (build 21.0-b17, mixed mode)
$ javac -version
javac 1.7.0
$ javac MyDataSource.java 
MyDataSource.java:7: error: MyDataSource is not abstract and does not override abstract method getParentLogger() in CommonDataSource
public class MyDataSource implements DataSource {
       ^
1 error

Java 1.6 용으로 작성된 소스 파일을 사용하고 Java 1.6 바이트 코드를 생성하며 Java 1.6 런타임 JAR을 찾을 위치를 컴파일러에게 알려야합니다.

$ javac -source 1.6 -target 1.6 -bootclasspath <path to Java 1.6 JRE>/lib/rt.jar MyDataSource.java 
$ file MyDataSource.class 
MyDataSource.class: compiled Java class data, version 50.0 (Java 1.6)
$ javap MyDataSource
Compiled from "MyDataSource.java"
public class MyDataSource implements javax.sql.DataSource {
  public MyDataSource();
  public java.io.PrintWriter getLogWriter() throws java.sql.SQLException;
  public void setLogWriter(java.io.PrintWriter) throws java.sql.SQLException;
  public void setLoginTimeout(int) throws java.sql.SQLException;
  public int getLoginTimeout() throws java.sql.SQLException;
  public <T extends java/lang/Object> T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
  public boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException;
  public java.sql.Connection getConnection() throws java.sql.SQLException;
  public java.sql.Connection getConnection(java.lang.String, java.lang.String) throws java.sql.SQLException;
}

먼저 @Override 주석없이 요청 된 새 메소드를 추가하십시오.

새로운 메소드를 지원하고 싶지 않으면 SQLFeatureNotSupportedException을 던지십시오.

다른 DataSource를 래핑하고 6과 7을 지원하려면 리플렉션을 사용하여 메소드가 있으면 메소드를 호출하십시오.





datasource