0

假设我在 Spring 中使用 ApplicationContext 实现。

ApplicationContext 是 Java Spring Framework 中的一个接口,我无法更改它。

如何确保此实现只能有一个实例?

例如。我有以下代码 -

public class ApplicationContextSingleton 
{
     private static ApplicationContext context;
     private static int numberOfInstances = 0;

     public static ApplicationContext getApplicationContext()
     {
         if(numberOfInstances == 0)
         {
             context = new ClassPathXmlApplicationContext("spring.xml");
             numberOfInstances++;
         }
         return context;
     }
}

这样,我可以确保只有一个 ApplicationContext 实例,前提是它的获取方式如下 -

ApplicationContext context = ApplicationContextSingleton.getApplicationContext();

但这并不能阻止另一个程序员说——

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 

从而创建一个新的ApplicationContext。如何防止这种情况发生?

4

5 回答 5

3

你想做ApplicationContext一个单例,所以我会用我自己的自定义类覆盖这个类,确保它首先出现在类路径上,并让它有一个私有构造函数。

也就是说,如果你下定决心让它成为单身人士。正如其他答案和评论所指出的,有更好的方法来解决您的问题。

应该注意的是,覆盖部分库通常不是一个好主意,因为它可能会在以后引起头痛,尤其是当您尝试升级框架版本时。

于 2012-06-12T17:30:42.913 回答
2

除非有人能想出一些非常有创意的东西,否则我认为没有办法做到这一点。这类似于尝试制作int单例。只是不会发生,因为您无法控制您没有编写的类的使用。您只需要相信您的开发人员不会创建第二个上下文。

或者,我几乎可以保证这是不可能的,但是您可以获得spring 的完整源代码,进行一些代码更改以使上下文成为单例,然后自己构建它。这不是一个可能的解决方案,但无论如何我觉得有必要指出它。

于 2012-06-12T17:32:06.237 回答
1

没有办法做到这一点,因为

ClassPathXmlApplicationContext 没有被 Spring 实现为单例模式。告诉每个人你有一个实用的方法来访问上下文对象并使用 new 创建上下文是昂贵的。

于 2012-06-12T17:30:54.893 回答
1
  1. 使用自动构建系统来构建您的代码,只要它提交到您的软件存储库。
  2. 将工具集成到您的构建过程中,例如 FindBugs 或 PMD。如果这些工具触发了某些条件,则构建失败并且不允许生成任何工件。
  3. 在您的集成工具中创建一个案例,寻找创建自己的上下文的开发人员。

所以你不能阻止他们这样做,但你可以阻止他们把这些东西推到你的开发、质量保证和产品环境中。这可能看起来有点矫枉过正,但这种过程将有助于您的开发人员可以做但不应该做的数百件事。

于 2012-06-12T17:40:20.930 回答
0

Josh Block 建议在Effective Java中使用枚举。这不是那本书的链接,但它展示了他和旧的方式(替代)方式

于 2012-06-12T17:30:28.723 回答