16

私のビュー スコープの managedBean では、DB からのデータをリストに入力する必要があります。コンストラクターからの直接呼び出しを介してこれを行っています。次のようなものです。

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

ただし、このメソッドは、次のように @PostConstruct アノテーション付きメソッドで呼び出すことができます。

public MyClass(){
}

@PostConstruct
populateFromDb(){...}

これの違いは何ですか?

4

1 に答える 1

36

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

public TrainingClassForm() {

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

    }


スタックに関するこの質問を参考にしてください
マネージド Bean では@PostConstruct、通常の Java オブジェクト コンストラクターの後に呼び出されます。
コンストラクターが呼び出されたとき、Bean はまだ初期化されていません。つまり、依存関係は注入されていません。メソッドでは@PostConstruct、Bean は完全に初期化され、依存関係を使用できます。これは、このメソッドがBean のライフサイクルで 1 回だけ

@PostConstruct呼び出されることを保証する契約です。Bean がその内部作業でコンテナーによって複数回インスタンス化されることは (ほとんどありませんが) 発生する可能性がありますが、1 回だけ呼び出されることが保証されます。 クラスがコンストラクターですべての初期化を実行する場合、実際には冗長です。 @PostConstruct
@PostConstruct
ただし、セッター メソッドを使用してクラスに依存関係が注入されている場合、クラスのコンストラクターはオブジェクトを完全に初期化できず、すべてのセッター メソッドが呼び出された後に初期化を実行する必要がある場合があるため、これとこれ@PostConstruct
参照してください。

于 2013-05-14T11:34:17.860 に答える