1

非常に単純明快な質問です。

次のようなセッション スコープのマネージド Bean があります (PrimeFaces範囲スライダーのデモ)。

@ManagedBean
@SessionScoped
public final class RangeSliderBean implements Serializable
{
    private static final long serialVersionUID = 1L;
    private static final byte scale=2;

    private BigDecimal maxPrice;
    private BigDecimal minPrice;

    public RangeSliderBean()
    {
        maxPrice=new BigDecimal(100).setScale(scale, RoundingMode.HALF_UP);
        minPrice=new BigDecimal(5).setScale(scale, RoundingMode.HALF_UP);
    }

    @PostConstruct
    private void init()
    {

    }

    //Mutators and accessors
}

上記のセッション スコープ マネージド Bean の指定された 2 つのフィールドは、XHTML ページにバインドされます。

<h:form id="rangeForm" prependId="true">
    <p:panel header="Shop by Price">
        <h:panelGrid id="rangeSliderPanelGrid" columns="1" style="margin-bottom:10px">
            <h:outputText id="displayRange" value="Min : #{rangeSliderBean.minPrice.toPlainString()} Max : #{rangeSliderBean.maxPrice.toPlainString()}"/>

            <p:slider for="txtMinPrice, txtMaxPrice" 
                      minValue="#{rangeSliderBean.minPrice}" 
                      maxValue="#{rangeSliderBean.maxPrice}" 
                      display="displayRange" 
                      style="width:170px" 
                      range="true" displayTemplate="Min : {min} Max : {max}"/>
        </h:panelGrid>

        <h:inputHidden id="txtMinPrice" value="#{rangeSliderBean.minPrice}" converter="#{bigDecimalConverter}"/>
        <h:inputHidden id="txtMaxPrice" value="#{rangeSliderBean.maxPrice}" converter="#{bigDecimalConverter}"/>
        <p:commandButton value="Submit"/> <!--Update/process is temporarily omitted.-->
    </p:panel>
</h:form>

これらのフィールドが@PostConstructieinit()で注釈が付けられたメソッドで初期化される場合、この場合 (スニペットに示されているようにコンストラクターで初期化するのではなく)、指定された値は、ユーザーがログインするまで (セッションが作成されない限り) 設定されません。 .

コンストラクターでどのように初期化できますか?少し混乱しますか? (コンストラクターは、アノテーションが付けられたメソッドが呼び出される前に呼び出されることを知ってい@PostConstructます)。

4

1 に答える 1

2

コンストラクターでどのように初期化できますか?少し混乱しますか? ( @PostConstruct によってアノテーションが付けられたメソッドが呼び出される前に、コンストラクターが呼び出されることはわかっています)。

@PostConstruct'sinitメソッドは、注入されるフィールド (つまり、Ejbs) を初期化する場合にのみ使用してください。インジェクションと依存関係がない場合、initメソッドはほとんど役に立たなくなります。Bean のコンストラクターは、Bean 自体のプロパティを初期化するために使用されます。あなたの例では、インジェクションがないため、そのメソッドを安全に削除でき@PostConstructますinit

これらのフィールドが @PostConstruct 、つまり init() によってアノテーションが付けられたメソッドで初期化される場合、この場合 (スニペットに示されているようにコンストラクターで初期化する代わりに)、指定された値は、ユーザーがログインしない限り、ログインするまで設定されません(セッションが作成されます)。

これは通常の動作です。新しいセッションが作成されたときにのみ Bean が作成および初期化されるため、 notを強調する理由はありません。@SessionScoped

詳細については、リンクを確認してください。質問はすでに回答されています: @PostConstruct を使用する理由は?

于 2013-12-06T23:12:56.213 に答える