【问题标题】:Should I use Spring to configure my XML parser?我应该使用 Spring 来配置我的 XML 解析器吗?
【发布时间】:2011-02-21 10:14:30
【问题描述】:

我的应用程序中有以下样板代码。它可能会在涉及解析不同类型对象的几个不同对象中重复:

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);

SAXParser parser = factory.newSAXParser();
AssetTOSaxHandler handler = new AssetTOSaxHandler();
parser.parse( assetStream, handler );
return handler;

由于handler 对象是有状态的,我认为“新”是获得它的最佳方式,但我突然想到factory 和parser 可能是我可以注入的可重用对象改为我的对象以实现更简洁的代码。

这是你做的吗?那有用吗?您使用了哪些框架和语法?

【问题讨论】:

    标签: java xml spring


    【解决方案1】:

    如果解析器的选择是一个横切关注点,并且您将在多个位置使用它,我会在一个位置定义解析器工厂并将工厂注入到使用它的那些对象中。此外,我不想因为工厂更改而不得不更改 SAX 解析器的每个用户。如果他们的任务发生变化,我宁愿让他们改变。

    我已经在几个项目中使用了 Spring,但我对正在发生的所有魔力相当不满意。目前,我正在更多地关注Guice,当涉及到依赖注入时,这在我看来似乎更有吸引力。如果您使用 Spring 提供其他服务,请务必这样做。此外,Guice and Spring can be combined。

    注射会是这样的

    public class Example{
    
      @Inject 
      private SAXParser parser;
    
      ...
    
      AssetToSaxHandler createHandlerFor(final InputStream assetStream) {
        AssetTOSaxHandler handler = new AssetTOSaxHandler();
        parser.parse(assetStream, handler);
        return handler;
      }
    }
    

    然后您将有一个 Guice 模块,您可以在其中声明绑定

    public class ParserModule extends AbstractModule {
    
        @Override
        public void configure() {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setNamespaceAware(true);
            bind(SaxParser.class).toInstance(factory.newSAXParser());
        } 
    }
    

    在你的初始化类中你会调用Guice.createInjector(new ParserModule(),...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2011-04-22
      • 1970-01-01
      • 2020-12-21
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多