Spring:将Resource作为InputStream注入工厂方法

时间:2010-09-02 10:38:32

标签: java spring

我想使用OWASP的反samy。 他们得到了一个Policy对象,它通过工厂方法实例化。

public static Policy getInstance(InputStream inputStream);

需要传递给factory-method的InputStream表示策略对象的配置文件。

是否可以在spring xml上下文配置中使用创建策略bean? 我知道,有一个Resource对象,可以从classpath加载文件。但我需要的是从该Resource对象中创建一个InputStream。我可以直接在xml-spring-context中执行此操作吗?或者我是否需要编写java代码才能获得InputStream?

2 个答案:

答案 0 :(得分:15)

将factory-method方法与构造函数arg(将映射到工厂方法参数)一起使用,并从资源表示法自动转换为InputStream。

<bean id="policy" class="org.owasp.validator.html.Policy"
    factory-method="getInstance">

    <!-- type needed because there is also a getInstance(String) method -->
    <constructor-arg
        value="classpath:path/to/policyFile.xml"
        type="java.io.InputStream" />

</bean>

请参阅Spring Reference的以下部分:

答案 1 :(得分:4)

@ seanizer的解决方案是一个很好的解决方案,如果Policy在完成阅读后关闭了InputStream,但显然它没有。这将导致泄漏,其严重性取决于调用的频率以及资源的性质。

为安全起见,您应该考虑使用writing a custom FactoryBean implementation,它会安全地处理InputStream的打开和关闭。 FactoryBean会注入一个Resource对象。