当前位置: 首页 > 面试题库 >

将单例制作为Spring bean的正确方法

郭逸清
2023-03-14
问题内容

我正在将单例转换为Spring bean,因此,如果单例无法初始化,则整个Web应用程序的spring上下文将无法正确加载。

使Spring上下文无法正确加载的优点是,人们会在部署过程中注意到并修复配置。与使用“非春季bean”单例相反:当初始化期间引发异常时,没有人注意到..直到实际用户抱怨缺少功能。

我的更改正在按预期方式工作。.但是我不确定自己是否做对了。
有什么想法吗?

代码如下:

public class MySingleton {

    private static MySingleton INSTANCE = null;
    private MySingleton(){}


public static MySingleton getInstance(){
    if(INSTANCE == null){
        synchronized(MySingleton.class){
            if(INSTANCE == null){
                try{
                    doWork()
                }catch(Exception e){
                    throw new IllegalStateException("xyz", e);
                }
                INSTANCE = new MySingleton();
            }
        }
    }

    return INSTANCE;
}

private static void doWork() {
    // do some work
    }

}

在spring config xml中,bean将定义为:

<bean id="MySingletonBean"
    class="com.MySingleton"
    factory-method="getInstance" lazy-init="false" singleton="true">
</bean>

注意:
大多数操作与本文中讨论的策略类似:http : //springtips.blogspot.com/2007/06/configuration-
hell-remedy-with.html

编辑1:

使用此单例的类本身不是spring bean。它们只是非spring
pojos,我无法转换为spring。他们必须依靠getInstance()方法来获取Singleton。

编辑2 :( 将我在下面的评论复制到此描述部分中),我试图针对两件事:

  1. 我希望Spring初始化单例。因此,如果初始化失败,则应用程序加载失败。
  2. 我希望其他类可以使用类而不必依赖contextAwareObj.getBean(“ MySingleton”)

编辑3(决赛):
我决定将此类作为单身..,而不是使其成为弹跳豆。如果初始化失败,它将在日志文件中记录一些内容。.希望进行部署的人员注意....我放弃了前面提到的方法,因为我认为它将在将来造成维护方面的噩梦,因此我不得不选择-
单例-或-四季豆。我选择单身人士。


问题答案:

必须 声明该INSTANCE字段volatile为双重检查锁定才能正常工作。

参见有效Java,条款71。



 类似资料:
  • 问题内容: W3文档有一个以开头的嵌套列表示例,但是他们从未使用不推荐使用的示例对其进行更正,也从未确切说明该示例出了什么问题。 那么,哪种方法是编写HTML列表的正确方法呢? 选项1 :嵌套是父级的子级 选项2 :嵌套是其所属的子级 问题答案: 选项2 是正确的。 嵌套列表应 位于嵌套列表 的 元素 内 。 链接到列表上的W3C Wiki(摘自以下评论):HTML Lists Wiki。 链接到

  • 问题内容: 因此,我正在考虑建立一个业余项目,这只是为了完成我的编程/设计。 它基本上是一个多线程的网络蜘蛛,更新了相同的数据结构object-> int。 因此,为此使用数据库绝对是矫kill过正,而我唯一想到的就是用于包含我的数据结构的线程安全单例。http://web.archive.org/web/20121106190537/http://www.ibm.com/developerwor

  • 问题内容: 我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。似乎是自然的回报类型。 不管我做什么,除非聘用了丑陋的人,否则似乎都无法使编译器满意。 我想摆脱它。但是如果我这样做,我会得到警告 (我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合返回类型,则会收到警告 我注意到 确实 声明了;但这是完全不同的类型- 返回a 作为原始类型。我发现最

  • 实际上,我已经使用ffmpeg本机aac编码器将一个音频文件从ac3编码到aac,但问题是该文件没有正确播放,更具体地说,我在不同的媒体播放器中播放了该文件,但大多数都是从19秒开始的,在vlc中,甚至直到我寻求超过19秒的持续时间才开始播放。 我使用的命令是:-ffmpeg-i source。mkv-Map0:a:0-c:aac音频。mp4。

  • 问题内容: 有没有一种干净的方法可以阻止风暴,而又不使用“ kill XXX”杀死风暴,其中XXX是PID? 我运行“ storm kill topology- name”杀死拓扑,但是在那之后,有没有一种干净的方法来关闭worker,nimbus,supervisor和ui? 我没有从文档中找到与此命令相对应的任何命令:https : //github.com/nathanmarz/storm/

  • 我试图做一个简单的绘图(对于这个例子,做一个y=x^2的绘图就足够了),我想根据它们的大小设置点的颜色。 下面是我的简单示例,我说: 使用,它生成一个带有彩色点的绘图,但colorbar与彩色值不一致。(这是我的第一篇文章,无法发布图片)。使用命令给出正确的范围,但颜色仍处于关闭状态。 所以我有两个问题:(1)如何调整颜色以适应给定范围的色条?在我的真实数据中,在某些情况下,我看到的值在-50到5