新しいプロジェクト、導入MySQLの依存関係をMavenの、次のコードを実行します。
パブリック クラスのテスト{ 公共 静的 ボイドメイン(文字列[]引数){ ServiceLoader <ドライバ>ローダ= ServiceLoader.load(ドライバ。クラス)。 反復子 <ドライバ>イテレータ= loader.iterator()。 一方、(iterator.hasNext()){ ドライバドライバ = iterator.next()。 System.out.println( "ドライバ"+ driver.getClass()+"、ローダ:" + 。driver.getClass()のgetClassLoader())。 } のSystem.out.println( "当前线程上下文类加载器:" + 。にThread.currentThread()getContextClassLoader())。 するSystem.out.println( "ServiceLoader的累加载器:"クラス.getClassLoader()); } }
業績
ドライバ:sun.jdbc.odbc.JdbcOdbcDriverクラス、ローダー:nullの ドライバ:クラスはcom.mysql.jdbc.Driver、ローダー:sun.misc.Launcher$AppClassLoader@1c898b41 現在のスレッドのコンテキストクラスローダ:sun.misc.Launcher $ AppClassLoader 1c898b41 @ ServiceLoader疲れローダー:ヌル
ServiceLoaderコードとドライバーなぜServiceLoader <ドライバー>ローダー= ServiceLoader.load(Driver.class)、JDKクラスが付属している。やるドライバをロードするMySQLができますか?
これは、実際にSPI仕様で、MySQLのドライバをロードするために、ドキュメントのドキュメントServiceLoaderクラス内の特定の命令がありますが、本当に仕様は、以下のパッケージのパスに巻き込まMETA-INF /サービスの瓶を提出しなければならない、サードパーティの実装を必要としていますjava.sql.driverという名前のテキストファイルの内容は、ファイル名は瓶がたくさんこのタイプのサービスを実現含まれていることを示す、サーバインタフェースの名前で、テキストファイルの内容ははcom.mysql.jdbc.Driverあり、その実装クラスを示してい完全修飾名。