hakobera's blog

技術メモ。たまに雑談

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 に相当する物ですが、どうしてここで取得しているのかについては、また後で説明します。