正在解析自定义标记内的 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 引用才不会被破坏。
我有一个 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 引用才不会被破坏。