2013-05-14 13 views
16

私のビューscoped managedBeanでは、私はDBからのデータでリストを設定する必要があります。 Imは、コンストラクタから直接呼び出してこれをやって、このような何か:JSF - @PostConstructとコンストラクタからの直接メソッド呼び出しの違いは何ですか?

public MyClass(){ 
    list=populateFromDb(); 
} 

が、この方法は次のように、@PostConstruct注釈付きの方法で呼び出すことができます。

の違いは何であるか
public MyClass(){ 
} 

@PostConstruct 
populateFromDb(){...} 

この?

+1

[なぜ@PostConstructを使用するのですか?](http://stackoverflow.com/q/3406555/1055089) – Vrushank

答えて

35

Beanに要求スコープがある場合、@PostConstructは毎回実行されます。マネージドBeanがインスタンス化された後、Beanがスコープに置かれる前に呼び出されます。このようなメソッドは引数を取らずにvoidを返し、スローされるチェック例外を宣言しないことがあります。メソッドはpublic、protected、private、package privateのいずれかです。このメソッドがチェックされていない例外をスローすると、JSF実装はマネージドBeanを処理してはなりません。そのマネージドBeanインスタンスのメンバは呼び出されません。マネージドBeanではthis question of stack
にあなたをReffering

public TrainingClassForm() { 

    } 
    @PostConstruct 
    public void init() { 
     if (this.trainingListModel.getListDataModel() != null) { 
      this.trainingListModel.getAllTrainingClasses(); 
     } 

    } 


@PostConstructは、通常のJavaオブジェクトコンストラクタの後に呼び出されます。
コンストラクタが呼び出されると、Beanはまだ初期化されていません。つまり、依存関係は注入されません。 Beanが完全に初期化されていて、依存関係

@PostConstructを使用することができます@PostConstruct方法では、このメソッドが呼び出されること一度だけのBeanのライフサイクルに保証契約です。 Beanがコンテナ内部で複数回インスタンス化されることはありますが(ただしありそうもありませんが)、@PostConstructが1回だけ呼び出されることが保証されます。
クラスがコンストラクタですべての初期化を実行する場合、@PostConstructは実際には冗長です。
しかし、あなたのクラスがsetterメソッドを使って依存関係を注入している場合、そのクラスのコンストラクタはオブジェクトを完全に初期化することができず、すべてのsetterメソッドが呼び出された後にいくつかの初期化を行う必要があります。また、see thisthis

+0

と私の側からのものです。データベースからフェッチされた値を持つinputtextフィールドを初期化したい場合は、PostConstructの助けを借りて行うことができますが、コンストラクタ内で同じことをしようとすると失敗します。 PostContructを使用せずに初期化する必要があります。時間がある場合は、こちらもお答えください:http://stackoverflow.com/questions/27540573/how-to-initialize-inputtextfield-with-a-value-from-database-on-runtime-without-t –

関連する問題