2017-02-09 19 views
2

私はあなたに私の問題を説明しようとします。毎回の前にSpring 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 */ 
    } 
} 

その後、私はそのコピーの結果に依存しており、それらは次のように定義されているいくつかの豆があります

を春の値でプレースホルダをリンクする際 file://${user.home}/${path.to.copy}/file.properties存在しません:
@PropertySource(value = "file://${user.home}/${path.to.copy}/file.properties") 
@Service 
public class Bean{ 
    /** Bean Stuff */ 
} 

私の問題は、Beanが初期化されるときにファイルがあることです。 最初のBeanを作成し、それらのファイルを正しくコピーするために他のBeanの前に呼び出す方法があるかどうかは疑問でした。

ありがとうございます。

+0

[別のBeanに依存](http://docs.spring.io/spring/docs/current/javadoc-api/org/) springframework/context/annotation/DependsOn.html)が役に立ちます –

+1

これはうまくいかないでしょう。 '@ PropertySource'は' @ Value'アノテーションを評価する前に処理される予定であり、マルチパスプロセスではないので、単に置くだけで動作しません。 'ApplicationContext'が初期化される前にそのロジックを実行する必要があります。たとえば、' ApplicationContextInitializer'のように配置する必要があります。 –

答えて

-1

正しくそれら のファイルをコピーするために を作成し、他のBeanの前に呼び出される最初のBeanの道があったのであれば、私は思っていました。

クラスAをクラスBの後でのみインスタンス化するような方法でBeanの作成を制御したい場合は、これを行うことができます。

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

しかし、あなただけのインスタンス化よりも多くのものを求めている、私は春の雲の設定サーバをスピンアップすることで、このユースケースに対処します。

-1

afterPropertiesSet()メソッドをオーバーライドしないでください。名前を変更して@Override注釈を削除してください。あなたのメソッドの名前を変更してください(通常はinit()と呼ばれますが、任意の名前にすることができます)。@PostConstructアノテーションを付けてメソッドをマークし、Springはコンストラクタの直後にそれを呼び出し、すべての注入が完了します。それはあなたのトリックを行う必要があります。次に、@DependsOn(Your_bean_name)アノテーションでそれに依存する他のBeanを定義します。

+0

'@ PostConstruct'アノテーション付きメソッドの' afterPropertiesSet'を変更するのはなぜですか? –

+0

これは、everybeanのすべてのプロパティが設定された後にafterPropertiesSetが呼び出されることを意味しますか? –

+0

あなたはSpringインタフェースを実装することは想定されていないので、Springメソッドをオーバーライドする必要はありません。注釈@PostConstructは要求されたファンクショナリティを提供します –

関連する問題