【问题标题】:Reference to singleton bean in SpringSpring中单例bean的引用
【发布时间】:2012-05-30 22:50:58
【问题描述】:

我是 Spring 新手,因此如果问题似乎微不足道,请提前道歉。

当我在 spring 中声明一个 bean 时,它默认是单例的。当 spring 从 config.xml 初始化 bean 时,它使用默认创建者。如果我为一个类声明我的私有创建者和 getInstance 方法,我不会引用在 Spring 初始化期间创建的 bean - 我只是再次创建相同的类,并且稍后调用 getInstance() 时会引用这个类。

我的问题是如何从代码中获取对初始化期间创建的单例(对 config.xml 中定义的 bean)的引用。

【问题讨论】:

    标签: java spring jakarta-ee web-applications application-singleton


    【解决方案1】:

    如果您的代码中有工厂方法,则让 xml 配置调用该工厂方法而不是构造函数。不要从您的 Java 代码中调用 getInstance

    <bean id="fromFactory" class="org.example.MyFactory" factory-method="getInstance" />
    

    【讨论】:

      【解决方案2】:

      默认情况下,Spring 将创建您的类的单个实例。它将调用一次类的构造函数。我认为您已将此与

      public static void getInstance() 
      

      Java 中单例的惯用语,这是一种尝试在你的类中强制你永远不能拥有多个实例。

      Spring 已经构建了您的类的单个实例,并将其存储在 Spring 容器中以供您使用。要获取 Spring 创建的实例的引用,您需要从 Spring 的应用程序上下文中检索它。

      【讨论】:

      • 感谢您澄清困惑 :) 下次一定会记住它。
      【解决方案3】:

      我认为这可能与您的问题有关: Why is Spring's ApplicationContext.getBean considered bad?

      有很多方法:你可以从 ApplicationContext 获取你的 bean 实例,你可以 @Autowire 它等等。

      【讨论】:

        【解决方案4】:

        如果您的类实现了Singleton Pattern,那么getInstance() 将无法返回除 Spring 创建的实例之外的实例。

        如何获取初始化期间创建的单例的引用

        基本上,您应该将它injected 提供给您需要它的其他班级。 也可以通过ApplicationContext.getBean(), although it is not that elegant参考。

        【讨论】:

        • 非常感谢!我认为这就是我一直在寻找的东西,但必须查看下面给出的 maksimov 链接。
        • 当然。请注意,我给了你同样的链接(最后一个)。
        • @maksimov,我已经检查并发现you had posted your answer several minutes before I posted mine。但是,相信我,在我发布我的答案之前,我没有看到你的答案。我们刚刚独立得出结论,这是一个相关链接——这是一件好事。
        • @bpgergo 毕竟我的评论中有一个笑脸。这一切都是为了共同利益,所以别担心(我不担心)。
        猜你喜欢
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多