Java 在自定义标记内解析spring导入语句
我有一个Java应用程序,它解析以下格式的xml文件Java 在自定义标记内解析spring导入语句,java,xml,spring,spring-bean,Java,Xml,Spring,Spring 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 h
<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标记包含一组原生springbean和import语句。otherElements标记包含一组元素,这些元素仅由生成此文件的单独应用程序使用。我的应用程序只对那些spring Bean和进口产品感兴趣
因此,我使用下面的自定义bean解析器来解析这个文件,并将springbean定义添加到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
}
}
}
}
公共类MyBeanDefinitionParser扩展了AbstractSingleBeanDefinitionParser{
@凌驾
受保护的void doParse(元素元素、ParserContext、ParserContext、BeanDefinitionBuilder){
元素myBeansElement=DomUtils.getChildElementByTagName(元素,“myBeans”);
if(myBeansElement!=null){
//解析“bean”元素
List beanElements=DomUtils.getChildElementsByTagName(MyBeanElement,“bean”);
for(元素beanElement:beanElements){
BeanDefinitionHolder bdh=parserContext.getDelegate().parseBeanDefinitionElement(BeaneElement);
parserContext.getRegistry().registerBeanDefinition(bdh.getBeanName(),bdh.getBeanDefinition());
}
//解析“import”语句
List importElements=DomUtils.getChildElementsByTagName(myBeansElement,“导入”);
对于(元素重要性:重要性){
//待办事项
}
}
}
}
解析和向上下文中添加Springbean(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();
}
}
//解析“import”语句
List importElements=DomUtils.getChildElementsByTagName(myBeansElement,“导入”);
Resource currentResource=parserContext.getReaderContext().getResource();
对于(元素重要性:重要性){
字符串importPath=importElement.getAttribute(“资源”);
试一试{
Resource importResource=currentResource.createRelative(导入路径);
parserContext.getReaderContext().getReader().loadBeanDefinitions(导入源);
}捕获(IOException | BeanDefinitionStoreException e){
e、 printStackTrace();
}
}
我还必须在bean元素之前解析import语句,这样bean引用就不会被破坏