Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中创建全局对象的最佳模式_Java_Spring_Design Patterns - Fatal编程技术网

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

在Java中创建全局对象的最佳模式,java,spring,design-patterns,Java,Spring,Design Patterns,我的应用程序需要在整个应用程序中访问某些对象。这些对象通过数据库填充 我希望在服务器启动时填充对象,然后在应用程序中根据需要填充对象 实现这一点的最佳模式是什么,我已经阅读了有关注册表模式的内容,但不确定这正是我想要的 我也在我的应用程序中使用Spring 3.x,Spring中有什么东西可以帮助我吗?既然你说你在使用Spring。最好的解决办法是使用。这个类允许您创建任意类型的bean,并将其返回到Spring上下文。Spring将管理这个bean,并通过使其成为一个单例来向其他bean公开它

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

我希望在服务器启动时填充对象,然后在应用程序中根据需要填充对象

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


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

既然你说你在使用Spring。最好的解决办法是使用。这个类允许您创建任意类型的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;
    }
}
公共类myObjectFoodFactoryBean扩展SimpleJDBaoSupport实现FactoryBean{
私有字符串查询;
@凌驾
公共字符串getObject()引发异常{
在这里使用SimpleJdbSupport返回ObjectFoo(因为我还扩展了SimpleJdbcDaoSupport)
}
@凌驾
公共类getObjectType(){
返回ObjectFoo.class;
}
@凌驾
公共布尔isSingleton(){
返回true;
}
}

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

你确定你的应用程序真的需要这个吗

全局对象是来自编程历史的工件,它们不应该再存在于适当的面向对象环境中,通常被认为是反模式的。 当然,您不需要到处访问这些对象。为什么不把它们注入需要它们的类中呢?如果使用Spring,则更容易,只需在上下文中声明依赖项


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

当我使用全局对象时,我通常将每个对象封装在一个单独的模式中。这是最简单的解决方案,您甚至可以仅在需要时延迟加载它


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

定义一个全局对象来存储这些信息怎么样?您可以控制对此对象的访问。如果您想监视此对象的状态,可以使用观察者模式。

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

设计考虑的一部分应该是这些对象是可变的还是不可变的。我还以为globals是一个反模式。@TomHawtin tackline:每个绝对声明都是一个反模式(包括这个)@TomHawtin tackline在OOP中使用全局变量在过程编程中可能使用全局变量的方式是一种反模式。但是,如果使用得当,它是可以的。问题是大多数程序员没有适当地使用它们…@BrianDriscoll对象是可变的,因为我希望在需要时刷新内容,所以在我想刷新对象的内容,这可能不需要额外的开销吗?如果你想刷新内容,那么这会变得很棘手。你不能用一个新的实例替换Spring中的所有bean。但是你要替换每个bean的内容。所以我建议在对象中对其进行刷新。这可能有点困难ricky。你可以使用
计时器
每x秒刷新一次,或者你可以把所有东西都做成一个原型,这意味着它每次都会创建一个新的实例。更新你的问题的更多细节,我会看看我能提供什么帮助。在OOP范例中,肯定有全局对象(或全局对象)的情况是必需的。例如,我见过的大多数应用程序都有一个应用程序运行时配置的单例实现。Spring构建在顶层依赖注入之上。默认情况下,全局空间中的所有对象都是单例。我认为Spring的方式没有任何问题,因为它做得对。+1表示指向这正是Spring singleton作用域与DI相结合的目的!在Spring中将它们声明为singleton,然后在需要时注入它们。对simpleton的有趣理解-抱歉,我是说singleton:@Alex Funcy我想我已经说过了:)我已经尝试实现了这一点,但是当我想刷新对象的内容时,它失败了..:(为什么不在对象上添加一个刷新方法呢?在第一次初始化singleton时,调用refresh来进行初始加载,每隔一次需要刷新时,只需显式地调用refresh。另外,不要忘记同步刷新,以确保在其他线程读取时不会更新