【问题标题】:NumberFormat thread safety with Spring使用 Spring 的 NumberFormat 线程安全
【发布时间】:2011-12-07 12:59:57
【问题描述】:

NumberFormatJavaDoc 说:

数字格式通常不同步。建议为每个线程创建单独的格式实例。

我想获得一个在我的对象中使用的实例。每个线程一个实例,或每个对象一个实例(对象不在线程之间共享)。目前该对象有一个包含 NumberFormat 的实例变量。

private NumberFormat nFormat = NumberFormat.getInstance(Locale.ITALY);

这已经很好了,我不应该有任何竞争条件,因为对象不是共享的。

但是,我不知道如何使用 Spring 来配置它,我知道 factory-method,但我不知道如何将 Locale 传递给它。

<bean factory-method="getInstance" class="java.text.NumberFormat" 
    scope="prototype" />

如何正确声明我的 NumberFormat bean?

【问题讨论】:

    标签: java spring thread-safety number-formatting


    【解决方案1】:

    你可以这样做:

    <bean id="numberFormat" factory-method="getInstance"
          class="java.text.NumberFormat" scope="prototype">
        <constructor-arg>
            <util:constant static-field="java.util.Locale.ITALY" />
        </constructor-arg>
    </bean>
    

    但是,我可能根本不会使用 Spring 来做这件事,而是使用静态工厂方法。

    【讨论】:

    • 谢谢 Sean,您为什么偏爱静态工厂方法?
    • @stivlo 因为除了注入它之外,Spring 不需要做任何其他事情。无需模拟 NumberFormat 进行测试,没有生命周期管理,没有依赖注入等。在有用的地方使用 Spring,但在这里使用它一无所获。
    【解决方案2】:

    我认为你可以使用:

    <bean factory-method="getInstance" class="java.text.NumberFormat" 
    scope="prototype">
       <constructor-arg><ref bean="locale_bean"/></constructor-arg>
    </bean>
    

    constructor-arg 元素用于传递构造对象所需的 bean 和值。另请参阅Examples of dependency injection 了解更多信息 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多