7.9. カスタム ClassLoader
Microcontainer では、1 つの Bean あたり 1 つのカスタム ClassLoader を定義できます。展開全体に対してクラスローダーを定義する場合は、循環的な依存関係 (たとえば、クラスロード自体に依存する新しく定義されたクラスローダー) を作成しないようにしてください。
例7.18 1 つの Bean あたり 1 つの ClassLoader の定義
<classloader><inject bean="custom-classloader:0.0.0"/></classloader> <!-- this will be explained in future article --> <classloader name="custom-classloader" xmlns="urn:jboss:classloader:1.0" export-all="NON_EMPTY" import-all="true"/> <bean name="CustomCL" class="org.jboss.demos.ioc.classloader.CustomClassLoader"> <constructor> <parameter><inject bean="custom-classloader:0.0.0"/></parameter> </constructor> <property name="pattern">org\.jboss\.demos\.ioc\..+</property> </bean> <bean name="CB1" class="org.jboss.demos.ioc.classloader.CustomBean"/> <bean name="CB2" class="org.jboss.demos.ioc.classloader.CustomBean"> <classloader><inject bean="CustomCL"/></classloader> </bean>
例7.19「カスタム ClassLoader テスト」 は、CB2 Bean がロード可能なパッケージ範囲を制限するカスタム ClassLoader を使用することを検証するテストを示しています。
例7.19 カスタム ClassLoader テスト
public class CustomClassLoader extends ClassLoader { private Pattern pattern; public CustomClassLoader(ClassLoader parent) { super(parent); } public Class<?> loadClass(String name) throws ClassNotFoundException { if (pattern == null || pattern.matcher(name).matches()) return super.loadClass(name); else throw new ClassNotFoundException("Name '" + name + "' doesn't match pattern: " + pattern); } public void setPattern(String regexp) { pattern = Pattern.compile(regexp); } }