从域对象中访问Spring单例的好方法?

时间:2010-07-07 02:48:31

标签: java spring singleton

我有一个由相当大的对象图组成的域模型,其中域对象正在创建其他域对象,依此类推。为了各种目的,每个域对象都需要访问少量单例类型的辅助对象。

当我记得我已经在使用Spring时,我正准备使用Java单例模式实现它们,我可以使用Spring在应用程序启动时实例化这些帮助程序中的每一个。

我的问题是如何在域对象中找到它们?这些都是通过“new”运算符创建的对象,不受Spring的控制。

我想我可以使用“getBean”方法,如果我掌握了Spring应用程序上下文(我没有) - 但这是好的表现吗?我需要这些东西快速...以及如何快速获取应用程序上下文?

3 个答案:

答案 0 :(得分:3)

在典型的Spring应用程序中,您所描述的跨实体逻辑通常在业务服务层(即Spring管理的单例)中实现,而不是域对象。 Spring应用程序中的域类往往是相当简单的数据容器,可能有一些方法可以对它们封装的数据执行基本操作,但是远远不能自行管理复杂的对象图。因此,业务服务对象管理域对象,而不是相反。

但是,如果您坚持将单例注入域对象,则可以使用AspectJ来实现此目的。 Spring本身并不支持这一点。

答案 1 :(得分:2)

答案 2 :(得分:2)

public class SpringApplicationContextProvider implements ApplicationContextAware {
  public void setApplicationContext(ApplicationContext ctx)
        throws BeansException {
      // Wiring the ApplicationContext into a static method
      SpringApplicationContext.setApplicationContext(ctx);
  }
}

将SpringApplicationContext定义为

public class SpringApplicationContext {
   private static ApplicationContext ctx;

   public static void setApplicationContext(
        ApplicationContext applicationContext) {
      ctx = applicationContext;
   }


   public static ApplicationContext getApplicationContext() {
      return ctx;
   }

   private SpringApplicationContext(){

   }
}

将SpringApplicationContextProvider定义为配置文件中的spring bean。现在可以使用此提供程序访问应用程序上下文。