【问题标题】:Good way to access Spring singleton from within domain objects?从域对象中访问 Spring 单例的好方法?
【发布时间】:2010-07-07 02:48:30
【问题描述】:

我有一个由相当大的对象图组成的域模型,其中域对象正在创建其他域对象等等。出于各种目的,这些域对象中的每一个都需要访问一小部分单例类型的辅助对象。

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

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

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

【问题讨论】:

    标签: java spring singleton


    【解决方案1】:

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

    但是,如果您坚持将单例注入到您的域对象中,您可以使用AspectJ 来实现这一点。 Spring 本身并不能很好地支持这一点。

    【讨论】:

    • 我听到你在说什么......但听起来你是在建议一个带有“事务脚本”之类的服务方法的贫血域模型。我是否夸大了这一点?我正在努力避免 DAO 的巨大同构树与我的域接口/类一起使用——通过让顶级域对象处理较低的域对象。想了解更多关于为什么这可能是一个糟糕的设计......
    • 不需要庞大的 DAO 树。 :-) 我通常每个相关的域类组有一个 DAO,而不是每个域类一个,并且每个都继承自具有通用 CRUD 方法的基类。但是 DAO 不承载业务逻辑,所以我认为您的 DAO 策略与跨实体业务逻辑是集中在域类还是服务对象中的决定是正交的。 Spring 鼓励后者,其他框架(例如 Seam)鼓励前者。像所有事情一样,需要权衡取舍,最好的方法可能是在中间的某个地方。
    【解决方案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。现在可以使用此提供程序访问应用程序上下文。

    【讨论】:

    • 效果很好。 Spring 没有内置此功能似乎很奇怪,不是吗?
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多