在应用程序的整个生命周期中,持久内存值(非db)存储在哪里



假设我想在实例化Spring应用程序时设置一个变量:

String timeUp = new Date().toString();

我希望能够从我的应用程序的所有bean中访问这个值,但我不想将其存储在数据库中。我只想把它保存在应用程序中的一个bean中,该bean可以从应用程序中所有其他bean访问。这怎么可能?

如果所有东西都生活在同一台机器上,您可能需要使用singleton。它是一个单一的实例,所有的东西都可以轻松地访问和调用它。

对于长期存储,如果数据库不是一个选项,您可能希望将您的bean序列化为一个文件,或者简单地编写自己的文件格式并将其输出。

默认情况下,Spring Beans是Singleton。因此,只需为此目的创建一个bean。

@Component
public class TimeUp {
  private final String _timeUp = new Date().toString();
  public String getTimeUp() { _timeUp };
}

然后把这个bean注入到你需要的地方。

@Component
public class Whatever {
  @Autowired TimeUp timeUp;
  public void useTimeUp() {
     System.out.println(timeUp.getTimeUp());
  }
}

ContextListenercontextInitialized方法中初始化的singleton将是我的第一个调用点。

实现这一点的一种方法是让servlet类或过滤器类中的一个类具有Date类型的公共静态最终成员,并在声明行上将其设置为新的日期对象。然后您可以执行"servlet类名(dot)公共成员名"来访问该值。

如果在servlet中执行此操作,则必须将web.xml中的servlet声明为"启动时加载"servlet。否则,直到第一次使用servlet时,它才会获得日期值,而这并不是您真正想要的:)

如果你真的只是想让应用程序正常运行,你应该能够使用以下

RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
long uptimeInMillis = mx.getUptime();

如果你正在寻找一个更抽象的答案,那么Chris给出了一个很好的解决方案。

这是单例的经典用法。如果您只有其中的几个,则可以为每个值创建一个singleton。如果你有一堆这样的,你可以写一个"服务",在那里你可以设置和查找值。

在春天,你可以这样做:

import org.springframework.beans.factory.FactoryBean;
public class TimeUp implements FactoryBean<String> {
  private final String _value = new Date().toString();
  public String getObject() {
    return _value;
  public Class<?> getObjectType() {
    return String.class;
  }
  public boolean isSingleton() {
    return true;
  }
}

然后在春天,你只需要做:

<bean id="timeUp" class="example.TimeUp"/>

您可以使用Singleton:

public class Environment {
    private final long startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
    public long getStartTime() {
        return this.startTime;
    }

    private static final Environment SINGLETON = new Environment();
    private Environment() {
        //nop
    }
    public static Environment getInstance() {
        return SINGLETON;
    }
}

最新更新