2011-03-08 5 views
2

동일한 작업을 수행하는 정적 메서드를 제공하는 드라이버 대신 Class.forName()을 사용하여 JDBC 드라이버를로드하는 논리는 무엇입니까?JDBC 드라이버가 클래스의 정적 초기화 프로그램에 자신을 등록하는 이유는 무엇입니까?

예를 들어 SomeDriverClass.loadDriver();으로 전화를 걸어 정상적으로 계속 연결하면 어떨까요? java.sql.DriverManager.registerDriver()에 대한 전화가 그런 식으로 일어날 수없는 이유는 무엇입니까?

답변

4

이렇게하면 컴파일 타임에 클래스 패스에 드라이버 클래스가 없어도됩니다. JDBC 코드가 모든 데이터베이스와 호환 될 수 있도록 컴파일 시간 클래스 경로에서 과거, 현재 및 미래의 수많은 JDBC 드라이버를 원하지는 않습니다. 드라이버 나 DB를 업그레이드/교체 할 때마다 코드를 다시 컴파일하고 싶지는 않습니다. 필요한 것은 드라이버 클래스 이름이 String이며 외부에서 구성 할 수 있습니다 (일반적으로 속성 또는 xml 파일).

다른 말로하면 : 이식성과 재사용 성.

개인적인 용도로 사용하는 경우 원하는대로 수행하십시오. 하지만 공용 라이브러리 (예 : ORM 또는 일부 데이터베이스 관리 도구)에서 배포 할 라이브러리에서 작업 한 경우 최종 사용자가 소스 코드를 가져 와서 매번 변경/다시 컴파일해야하므로 인기가 없습니다 데이터베이스를 지원하지 않습니다.

+0

인터페이스가이를 해결하므로 구체적인 클래스를 선언하는 대신 databaseDriver.load()와 같은 작업을 수행하고 IOC를 사용하여 드라이버 구현을 주입합니다. 예제 IDatabaseDriver driver = IOCContainer.getDriver(); driver.load(); –

0

이것은 서비스 공급자 프레임 워크의 일부입니다. 정적 팩토리 메서드에서 반환 한 개체 클래스는 메서드가 포함 된 클래스가 작성 될 때도 존재하지 않아도됩니다. 이를 통해 런타임에 여러 구현을 연결할 수있는 자리 표시자를 사용할 수 있습니다.

서비스 공급자 프레임 워크는 여러 서비스 공급자가 서비스를 구현하는 시스템으로, 시스템은 클라이언트가 구현을 사용 가능하게 만들어 구현과 분리합니다.

somedriver.loadDriver()가 구현되면 밀접하게 결합됩니다.

관련 문제