自动加载java静态块

时间:2013-02-04 11:03:30

标签: java

对于JDBC4,需要自动加载JDBC驱动程序。它是通过添加一个静态块来实现的,其中驱动程序在DriverManager中注册。但是当我在我的类中编写这样的块时,它只在我创建这个类的对象时执行。否则代码不会运行。

我的问题是:当驱动程序没有从应用程序代码创建时,它们如何自我启动,但是当我使用它来获取数据库连接时它们在DriverManager中注册了?

4 个答案:

答案 0 :(得分:2)

JDBC4规范的第9.2段规定,Driver实现必须在类加载时将自己注册到DriverManager,以便在Driver时实现加载静态初始化器会自动加载 注册驱动程序的实例。

因此,只需按(Driver)加载Class.forName("driverClassName")实现,就会使用DriverManager注册驱动程序。

或者,规范提供了一种方法,通过系统属性DriverManager从外部指定jdbc.drivers要加载(并因此注册)的驱动程序(参见第9.2.1节):

 java -Djdbc.drivers=com.acme.jdbc.AcmeJdbcDriver Test

这些注册方法也可以在旧的JDBC3实现中使用。

JDBC4引入了一种新的注册方法,利用服务提供者机制: 每个兼容的驱动程序必须提供包含META-INF/services/java.sql.Driver文件的jar。

DriverManager(在DriverManager.getConnection()调用上)使用java.sql.Driver服务提供程序并加载指定的类,从而自动注册驱动程序。这消除了调用Class.forName的需要(见第9.2.1段和第3.1段,第一个子弹)。

答案 1 :(得分:1)

在使用DataSource的早期版本的JDBC中,您经常会看到对Class.forName("driver.class")的调用

  

在以前的JDBC版本中,要获得连接,首先必须这样做   通过调用Class.forName方法初始化JDBC驱动程序。这个   方法需要java.sql.Driver类型的对象。每个JDBC驱动程序   包含一个或多个实现该接口的类   java.sql.Driver中。

文件进一步说明:

  

在类路径中找到的任何JDBC 4.0驱动程序都是   自动加载。 (但是,您必须手动加载任何驱动程序   在JDBC 4.0之前使用方法Class.forName。)

因此,我假设正在扫描实现驱动程序接口的任何类的类路径。

答案 2 :(得分:1)

您可以使用Java的ServiceLoader工具自动加载服务。

您需要在列出您的类的JAR中放置一个文件,然后Java将在需要服务时自动加载它。有关详细信息,请查看ServiceLoader的文档。

这个similar question的答案实际上说这是JDBC使用的方式。

答案 3 :(得分:0)

通常使用Class.forName来初始化类。