正在解析自定义标记内的 spring 导入语句

Parsing spring import statement inside custom tag

我有一个 Java 应用程序可以解析以下格式的 xml 文件。

<x:foo xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.hello.org/x/foo"
           xsi:schemaLocation="http://www.hello.org/x/foo http://schemas.hello.org/x/foo-1.0.0.xsd
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

    <x:myBeans>
        <bean id="my-bean-1" class="org.hello.sample.SampleClass1">
            <!-- some properties goes here -->
        </bean>
        <bean id="my-bean-2" class="org.hello.sample.SampleClass2">
            <!-- some properties goes here -->
        </bean>

        <import resource="sub-file.xml"/>
    </x:myBeans>

    <x:otherElements>
        <!-- Some non-spring xml elements (which are not used by application logic) goes here -->
    </x:otherElements>
</x:flow>

myBeans 标签包含一组原生 spring beans 和导入语句。 otherElements 标签包含一组仅由生成此文件的单独应用程序使用的元素。我的应用程序 只对那些 spring beans 和 imports 感兴趣。

所以我使用以下自定义 bean 解析器来解析此文件并将 spring bean 定义添加到 spring 上下文中。

public class MyBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    @Override
    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
        Element myBeansElement = DomUtils.getChildElementByTagName(element, "myBeans");
        if (myBeansElement != null) {

            // Parsing 'bean' elements
            List<Element> beanElements = DomUtils.getChildElementsByTagName(myBeansElement, "bean");
            for (Element beanElement : beanElements) {
                BeanDefinitionHolder bdh = parserContext.getDelegate().parseBeanDefinitionElement(beanElement);
                parserContext.getRegistry().registerBeanDefinition(bdh.getBeanName(), bdh.getBeanDefinition());
            }

            // Parsing 'import' statements
            List<Element> importElements = DomUtils.getChildElementsByTagName(myBeansElement, "import");
            for (Element importElement : importElements) {
                // TODO   
            }
        }
    }
}

解析并添加 spring bean(my-bean-1、my-bean-2)到上下文工作正常。 但是我如何解析文件 sub-file.xml(具有相同的结构)中定义的 bean 并将其添加到 spring 上下文中?

我能够按如下方式完成上述工作。

// Parsing 'import' statements
List<Element> importElements = DomUtils.getChildElementsByTagName(myBeansElement, "import");
Resource currentResource = parserContext.getReaderContext().getResource();
for (Element importElement : importElements) {
    String importPath = importElement.getAttribute("resource");
    try {
        Resource importResource = currentResource.createRelative(importPath);
        parserContext.getReaderContext().getReader().loadBeanDefinitions(importResource);
    } catch (IOException | BeanDefinitionStoreException e) {
        e.printStackTrace();
    } 
}

我还必须在 bean 元素之前解析 import 语句,这样 bean 引用才不会被破坏。