比方說,我想設置一個變量時,我的春天應用程序實例化:在應用程序的整個生命週期中,您在哪裏存儲持久性內存值(非db)?
String timeUp = new Date().toString();
我希望能夠從我的所有應用程序的豆訪問此值,但我不希望將其存儲在一個數據庫。我只想將它保存在應用程序中的一個bean中,該應用程序中的所有其他bean都可以訪問它。這怎麼可能?
比方說,我想設置一個變量時,我的春天應用程序實例化:在應用程序的整個生命週期中,您在哪裏存儲持久性內存值(非db)?
String timeUp = new Date().toString();
我希望能夠從我的所有應用程序的豆訪問此值,但我不希望將其存儲在一個數據庫。我只想將它保存在應用程序中的一個bean中,該應用程序中的所有其他bean都可以訪問它。這怎麼可能?
如果一切都在同一臺機器上,您可能需要使用singleton。這是一個可以輕鬆訪問和調用的單一實例。
對於長期存儲,如果數據庫不是一個選項,你可能想要將你的bean轉換爲一個文件,或者直接寫你自己的文件格式並輸出。
這是單身人士的經典用法。如果您只有其中的幾個,則可以爲每個值創建一個單例。如果你有一堆這些,你可以寫一個'服務'來設置和查找值。
在春天,你可以這樣做:在春季
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"/>
一個這樣做是讓你的servlet類的一個方式或過濾器類具有Date類型的公共靜態最終成員,並在聲明行上將其設置爲新的日期對象。那麼你可以做「servlet類名(點)公共成員名」來訪問這個值。
如果您在servlet中執行此操作,則必須在web.xml中聲明該servlet爲「加載啓動時」servlet。否則它將不會得到它的日期值,直到第一次使用該servlet時,這並不是你想要的:)
在ContextListener
的contextInitialized
方法中初始化的單例將是我的第一個呼叫點。
如果你真的只想應用程序的正常運行時間,你應該能夠如果你正在尋找一個更抽象的答案,請使用以下
RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
long uptimeInMillis = mx.getUptime();
,然後克里斯給了一個很好的解決方案。
您可以使用單例:
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;
}
}
的Spring Bean,默認情況下,單身。所以只需爲此創建一個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());
}
}