Spring で Hotdeploy その6
再読み込み対象の XML ファイルの登録。
XmlBeanDefinitionReaderCBP の機能を再現します。
/** * Registers each XML bean resource with the SpringSingletonReconfigurer. */ public class XmlBeanDefinitionReaderCBP extends JavassistClassBytecodeProcessor { public void process(ClassPool cp, ClassLoader cl, CtClass ctClass) throws Exception { CtMethod m = ctClass.getMethod("loadBeanDefinitions", "(Lorg/springframework/core/io/Resource;)I"); m.insertBefore("org.zeroturnaround.javarebel.integration.spring.SpringSingletonReconfigurer" + ".registerXmlResource($0, $1);"); } }
要するに loadBeanDefinitions をフックして、引数の XmlBeanDefinitionReader と XMLファイルに対応する Resource をセットで登録してます。これを継承で再現するには、loadBeanDefinitions メソッドではなくて、 initBeanDefinitionReader の方をオーバーライドします。
こんな感じ。
/** * {@link BeanDefinitionReader} を初期化します。 * @param reader XML形式のBean定義ファイルを読み込み用の{@link BeanDefinitionReader} */ protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) { basePackage = getServletContext().getInitParameter(BASE_PACKAGE_KEY); super.initBeanDefinitionReader(beanDefinitionReader); if (DeploymentMode.isDevelopmentMode()) { contextReconfigure = new ReloadableContextReconfigurer(getServletContext()); contextReconfigure.registerXmlResources(beanDefinitionReader, getConfigLocations()); } }
最初の basePackage は Seasar2 で言うところの、NamingConvention の basePackage に相当する物ですが、どうしてここで取得しているのかについては、また後で説明します。