特定のクラスバージョンのロード
さて、コンテナと制限付きクラスローダを使って、バージョン付きのクラスを格納しているコンポーネントを特定のアーカイブからロードできるようになりました。
リスト2に、コンポーネントコンテナのテストクラスのコードを示します。このコードでは、コンポーネントコンテナのインスタンスを2つ作成し、それぞれを2つの異なるバージョンのHelloWorldコンポーネントに使う別々の設定ファイルの名前で初期化しています。その後、ComponentContainer
クラスのcreateComponent
メソッドによって各バージョンのコンポーネントがロードされ、インスタンス化されます。
package com.jeffhanson.components; import junit.framework.*; import java.net.URL; public class ComponentContainerTest extends TestCase { // ============================================== // static methods // ============================================== public static junit.framework.Test suite() { return new TestSuite( ComponentContainerTest.class); } // ============================================== // constructors // =============================================== public ComponentContainerTest(String name) { super(name); } // ============================================== // non-public methods // ============================================== private String doLoadComponentTest( ComponentContainer container, String componentName) throws ComponentNotFoundException { Object componentObj = container.createComponent(componentName); return componentObj.toString(); } // ============================================== // public methods // ============================================== public void setUp() throws Exception { super.setUp(); } public void tearDown() throws Exception { super.tearDown(); } public void testLoadComponent1() throws Exception { String componentName = "com.jeffhanson.components.HelloWorld"; ComponentContainer container = new ComponentContainer( "HelloWorldV1-CDI.xml"); String componentStr = doLoadComponentTest(container, componentName); assertNotNull(componentStr); assertTrue(componentStr.equals( "Hello world V1!")); container = new ComponentContainer( "HelloWorldV2-CDI.xml"); componentStr = doLoadComponentTest( container, componentName); assertNotNull(componentStr); assertTrue(componentStr.equals( "Hello world V2!")); } }
それぞれのコンポーネントオブジェクトのインスタンスを呼び出すと、適切なバージョンのコンポーネントによって処理されます。
図3のシーケンス図は、フレームワークがコンポーネントをロードおよび作成する際の手順を示しています。
RectrictedURLClassLoader
クラスへの呼び出しが、既定のクラスローダのインスタンスに到達せずに終了していることに注目してください。これにより、RestrictedURLClassLoader
インスタンスに与えられたURLでのみクラス検索が行われます。
これで、クラスローディングを行うコンポーネントコンテナフレームワークの作成方法の説明は終わりです。このフレームワークによって、Javaコンポーネントの定義、バージョン管理、作成を行うための自己完結的なコンテキストを簡単に実現できるようになります。Javaのクラスローディング機能をこのような形で利用すると、クラスローディングを特定の場所に限定できるので、異なるバージョンのクラスを同時にロードできるようになります(これらのクラスはどちらも同じJVM上で作成、使用されます)。