2017-02-09 231 views
2

我會盡力向您解釋我的問題。Spring bean初始化之前的初始化

我有一個bean,其工作是將文件從我的類路徑複製到服務器上的本地文件夾。 這個bean這樣定義和使用屬性的值就知​​道位置,它應該複製文件:

@Service("wsConfig") 
public class WorkspaceConfig implements InitializingBean { 
    @Value("path.to.copy") 
    String path; 
    @Value("classpath.to.copy") 
    String folder 

    @Override 
    public void afterPropertiesSet() { 
     /** Do my copy stuff */ 
    } 
} 

然後,我有一些豆子取決於該副本的結果,那些被這樣定義:

@PropertySource(value = "file://${user.home}/${path.to.copy}/file.properties") 
@Service 
public class Bean{ 
    /** Bean Stuff */ 
} 

我的問題是,當bean被初始化時,當彈簧將佔位符與值鏈接在一起時,文件位於:file://${user.home}/${path.to.copy}/file.properties不存在。 所以我想知道是否有一種方法可以在任何其他bean之前創建並調用第一個bean,以正確地複製這些文件。

預先感謝您。

+0

定義依賴它的其他bean。可能[取決於另一個bean](http://docs.spring.io/spring/docs/current/javadoc-api/org/ springframework/context/annotation/DependsOn.html)可能會有所幫助 –

+1

這絕不會奏效。 '@ PropertySource'將在評估'@ Value'註解之前被處理,並且它不是一個多遍處理,所以簡單地說它就不起作用。在你的'ApplicationContext'被初始化之前,你需要執行這個邏輯,並且你需要把它放入,比如'ApplicationContextInitializer'。 –

回答

-1

所以我在想,如果有第一個bean來,以便正確地複製這些 文件創建 與其它bean之前調用的方法。

如果你只是想以這樣的方式來控制bean的創建,A類應該只在類B後實例化,那麼你可以這樣做。

@Service 
@DependsOn("B") 
public class A {} 

但是,你所要求的東西不僅僅是實例,我會解決由旋轉起來彈簧雲配置服務器這種使用情況。

-1

請勿重寫afterPropertiesSet()方法。將其重命名,並刪除@Override註釋。重命名你的方法(通常稱爲init(),但它可以是任何名稱)用@PostConstruct註釋標記該方法,Spring將在構造函數之後立即調用它,並完成所有注入。這應該做你的伎倆。然後使用註釋@ DependsOn(Your_bean_name)

+0

爲什麼更改'@ PostConstruct'註釋方法的'afterPropertiesSet'? –

+0

這是否意味着在設置everybean的每個屬性之後調用afterPropertiesSet? –

+0

你並不是假設實現任何Spring接口,因此不需要重寫任何Spring方法。註釋@PostConstruct爲您提供了所需的功能 –