假设我想在实例化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());
}
}
在ContextListener
的contextInitialized
方法中初始化的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;
}
}