我的应用程序需要访问整个应用程序中的某些对象。这些对象通过DB填充。
我想在服务器启动时填充对象,然后在需要的基础上填充应用程序。
实现这一点的最佳模式是什么,我已经阅读了有关注册表模式的信息,但不确定这是我想要的。
我也在我的应用程序中使用Spring 3.x,Spring中有什么东西可以帮助我吗?
答案 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/)