2011-12-13 58 views
2

我正在處理一個程序,我要將其輸出到一個文件,該文件的yyy/MM/dd格式的當前數據附加到文件名中。將當前日期字符串注入到Spring bean配置中

我想將表示輸出文件位置的File對象注入需要使用Spring的類中。

但是,我不知道如何在創建File對象時將當前日期附加到文件名參數。

在實際的代碼很容易:

String outputFileName = "someFile"; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 
outputFileName += " " + sdf.format(new Date()); 
File outputFile = new File(outputFileName); 

我怎麼能做到這一點在我的Spring bean配置文件?

是否可以做到這一點,如果是的話,我該怎麼辦?

回答

8

呃......從技術上說,你幾乎可以做任何事情。我使用的是FastDateFormat,因爲它的速度都很快(duh!)並且線程安全。 java.text.SimpleDateFormat可以作爲很好:

<bean id="fastDateFormat" class="org.apache.commons.lang.time.FastDateFormat" factory-method="getInstance"> 
    <constructor-arg value="yyyy/MM/dd"/> 
</bean> 

<bean id="currentDate" class="java.util.Date" factory-bean="fastDateFormat" factory-method="format"> 
    <constructor-arg> 
     <bean class="java.util.Date"/> 
    </constructor-arg> 
</bean> 

,然後簡單地注入:

@Resource 
private String currentDate; //2011/12/13 

注意,這將是更簡單的普通的Java運行或使用@Configuration方法:

@Bean FastDateFormat fastDateFormat() { 
    return new FastDateFormat("yyyy/MM/dd"); 
} 

@Bean String currentDate() = { 
    return fastDateFormat().format(new Date()); 
} 

這就是說,你爲什麼不直接在@PostConstruct上寫Java呢,而不是過分依賴DI呢?並非所有東西都需要注入...唯一的優點是它使測試更容易,因爲您可以注入假字符串並且不依賴當前日期。但在這種情況下想一下DateProvider接口,使生活更簡單。

你也真的想在整個應用程序生命週期中有相同的日期(它會在啓動時生成一次)嗎?如果沒有,currentDate豆必須有prototype範圍,你必須從容器中每次需要時懶洋洋地取它...

+0

我澄清了我的問題,這可能意味着你想更新你的答案?雖然我仍在考慮您的實際答案,但對於您最後一段的迴應,程序不會連續運行,但它會定期執行並從電子郵件附件中提取CSV數據,並將其每天合併到一個文件中。因此,日期在啓動時設置並且不會改變。我想我可以只注入一個字符串並在消費類中添加日期並創建該文件,但是如果有一種方法可以使用正確的名稱來傳遞文件,那麼它似乎更清潔 – chrisbunney

+0

@chrisbunney:您可以使用Spring XML(提示:['String.concat()'](http://java.xiruibin.com/String.html#concat(java.lang.String)),'factory-bean'和'factory-method')但我只是覺得不對。如果你真的**想這樣做,我可以給你一個完整的解決方案。但我強烈**反對它的建議。用10-20行XML替換4行代碼沒有任何收益......考慮使用@配置,因爲這至少可以讓你用Java編寫它。但相信,最好是手工寫一些東西,而不是依賴於任何地方的DI。 –

+0

接受。我的實際解決方案是通過創建一個特殊的工廠方法來創建正確的字符串並使用該參數和其他參數初始化bean,從而接受您的建議並在Java中執行日期配置部分。不一定是最乾淨的方法,但它完成了這項工作。 – chrisbunney