【问题标题】:initializing my factory through spring通过春天初始化我的工厂
【发布时间】:2012-08-13 14:10:15
【问题描述】:

我可以有如下工厂吗?

public class Factory
{
    private static Map<EnumXyz, IDAO> map = new HashMap<Sting, Object>();


    public static void init()
    {
        //how do i initialize my map through spring initialization
    }

    public static IDAO getDAO(EnumXyz dao)
    {
        if (map.containsKey(dao))
        return map.get(dao);
        else
        {
            throw new IllegalArgumentException("dao not supported " + dao);
        }

        return null;
    }

}
  1. 我的工厂如何通过 spring 初始化?
  2. 这种建厂方式正确吗?
  3. 还有其他更好的方法吗?

【问题讨论】:

    标签: java spring initialization factory


    【解决方案1】:
    1. 不要让所有东西都是静态的,尤其是 init() 方法。
    2. @Component注释你的bean
    3. 使用@PostConstruct 注释您的init() 方法。

    现在init() 方法在 Spring 构造您的 Factory 类时被调用,为它提供了一个初始化自身的钩子。

    【讨论】:

      【解决方案2】:

      我会将您的工厂实例化为 bean 本身,并拥有它的 instance - 不要将所有内容都设为静态。 Spring 本身可以控制您的 bean 是否为单例(默认为单例)。

      例如

      public class Factory {
         public Factory(final Map<String,Object} map) {
            this.map = map;
         }
      }
      

      还有你的 Spring 配置:

      <bean id="myFactory" class="Factory">
         <constructor-arg>
            <util:map>
              <!-- configure your map here, or reference it as a separate bean -->
              <entry key="java.lang.String" value="key">....</entry>
            </util:map>
         </constructor-arg>
      </bean>
      

      在您的构造函数中,传入在您的 Spring 配置中定义的地图。

      【讨论】:

      • 没听明白,能不能详细点
      • 而工厂本身将是单例类?
      • Factory 可以从多个地方调用,如何确保只有一个 factory 实例?
      • 如果你想让它成为一个单例。每个应用程序上下文将有一个它的实例(您可能只有一个应用程序上下文)。以上实例化了 Factory 类的实例,并在构造时为其提供地图
      • 我理解你的代码。但是我的问题是如果我把它做成单例,那么我该如何初始化它?我应该有一个以 map 作为参数的公共方法 init 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多