用Java创建全局对象的最佳模式

时间:2011-12-06 14:52:49

标签: java spring design-patterns

我的应用程序需要访问整个应用程序中的某些对象。这些对象通过DB填充。

我想在服务器启动时填充对象,然后在需要的基础上填充应用程序。

实现这一点的最佳模式是什么,我已经阅读了有关注册表模式的信息,但不确定这是我想要的。

我也在我的应用程序中使用Spring 3.x,Spring中有什么东西可以帮助我吗?

5 个答案:

答案 0 :(得分:3)

因为你说你正在使用Spring。最好的解决方案是使用FactoryBean。这个类允许你做的是创建一个你喜欢的任何类型的bean并将它返回到Spring上下文。 Spring将管理这个bean并将其暴露给其他bean,使其成为单例。一个例子:

public class MyObjectFooFactoryBean extends SimpleJdbcDaoSupport implements FactoryBean<ObjectFoo> {
    private String query;

    @Override
    public String getObject() throws Exception {
        return an ObjectFoo here using SimpleJdbSupport (Because I also extended SimpleJdbcDaoSupport)
    }

    @Override
    public Class<?> getObjectType() {
        return ObjectFoo.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

上面做了两件事。 1)扩展SimpleJdbcSupport,允许您访问数据库,以及2)实现FactoryBean,它将对象返回到Spring的上下文。完成此操作后,您可以@Autowire或在xml文件中使用它。

答案 1 :(得分:3)

您确定您的应用确实需要吗?

全局对象是编程过去的工件,它们不应该存在于适当的面向对象环境中,并且通常被认为是反模式。 当然,您无需在任何地方访问这些对象。你为什么不把它们注入需要它们的类中?如果你使用Spring,那就更容易了,只需要在上下文中声明依赖。

如果您需要这些对象中的许多对象,可以将它们全部包装在一个holder类中,并根据需要进行注入。

答案 2 :(得分:2)

当我使用全局对象时,我通常将每个对象包装成单例模式。这是最简单的解决方案,你甚至可以在需要时懒得加载它。

在某些情况下,这是一种非常有效的模式。例如,在任何iphone应用程序中,您都有一个可通过公共静态方法全局访问的单例应用程序对象

答案 3 :(得分:1)

如何定义存储这些信息的全局对象呢?您可以控制对此对象的访问。如果要监视此对象的状态,可以使用观察者模式。

答案 4 :(得分:1)

如果您的应用程序部署在多个服务器中(每个服务器都有自己的VM,因此将单例作为静态字段会变得混乱,并且基于上下文的属性将无法工作,除非服务器设置为复制,这也是不可靠的)。我建议使用数据库内存表,或其他一些与服务器无关的内存缓存。 (例如http://memcached.org/