假设我想在实例化Spring应用程序时设置变量:
String timeUp = new Date().toString();
我希望能够从我的所有应用程序的bean中访问此值,但我不想将其存储在数据库中。我只想将它保存在应用程序中的bean中,该bean可以从应用程序中的所有其他bean访问。这怎么可能?
答案 0 :(得分:2)
如果所有内容都在同一台计算机上,您可能需要使用singleton。这是一个单一的实例,一切都可以轻松访问和调用。
对于长期存储,如果数据库不是一个选项,您可能希望将serialize您的bean写入文件,或者只是编写自己的文件格式并输出到该文件。
答案 1 :(得分:2)
默认情况下,Spring Beans是Singletons。所以只需为此创建一个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());
}
}
答案 2 :(得分:1)
以ContextListener
的{{1}}方法初始化的单身人士将是我的第一个接听点。
答案 3 :(得分:0)
这是单身人士的经典用法。如果您只有其中的一部分,则可以为每个值创建一个单例。如果你有很多这些,你可以写一个'服务'来设置和查找值。
春天,你可以这样做:
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;
}
}
然后在Spring,您只需:
<bean id="timeUp" class="example.TimeUp"/>
答案 4 :(得分:0)
这样做的一种方法是让一个servlet类或过滤器类具有Date类型的公共静态最终成员,并在声明行上将其设置为新的日期对象。然后你可以做“servlet类名(点)公共成员名称”来访问这个值。
如果在servlet中执行此操作,则必须将web.xml中的servlet声明为“load-on-startup”servlet。否则在第一次使用servlet之前它不会得到它的日期值,这不是你想要的那样:)
答案 5 :(得分:0)
如果您实际上只是希望应用程序正常运行,那么您应该可以使用以下
RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
long uptimeInMillis = mx.getUptime();
如果您正在寻找更抽象的答案,那么Chris给出了一个很好的解决方案。
答案 6 :(得分:0)
您可以使用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;
}
}