web-dev-qa-db-ja.com

lazy-initのSpringのデフォルト動作

私は春の初心者です、ESP制御の反転。次の違いを理解して困惑しました

 <bean id="demo" class="Demo" lazy-init="false"/>
 <bean id="demo" class="Demo" lazy-init="true"/>
 <bean id="demo" class="Demo" lazy-init="default"/>

私の理解では、lazy-init = falseは起動時にBeanを作成し、lazy-init = trueは起動時にBeanを作成せず、特定のBeanの要求に応じてBeanを作成します。私の解釈が間違っている場合、ここで私を修正します。

lazy-initのデフォルトの動作は正確には何ですか?どのようにインスタンス化されますか?

54
srk

デフォルトの動作はfalseです。

デフォルトでは、ApplicationContext実装は、初期化プロセスの一部としてすべてのシングルトンBeanを熱心に作成および構成します。通常、この事前インスタンス化が望ましいのは、構成または周囲の環境のエラーが数時間または数日後ではなく、すぐに発見されるためです。この動作が望ましくない場合、Bean定義を遅延初期化済みとしてマークすることにより、シングルトンBeanの事前インスタンス化を防ぐことができます。遅延初期化Beanは、起動時ではなく、最初に要求されたときにBeanインスタンスを作成するようにIoCコンテナーに指示します。

読み上げることをお勧めします

62
Vjeetje

ここに来てJava configを使用している場合、次のようなアノテーションを使用してBeanをlazy-initに設定できます。

構成クラス内:

@Configuration
// @Lazy - For all Beans to load lazily
public class AppConf {

    @Bean
    @Lazy
    public Demo demo() {
        return new Demo();
    }
}

コンポーネントのスキャンと自動配線の場合:

@Component
@Lazy
public class Demo {
    ....
    ....
}

@Component
public class B {

    @Autowired
    @Lazy // If this is not here, Demo will still get eagerly instantiated to satisfy this request.
    private Demo demo;

    .......
 }
24
DavidR

beanlazy-init="default"設定は、囲んでいるbeans要素のdefault-lazy-init属性によって設定されたもののみを参照します。 default-lazy-initの暗黙のデフォルト値はfalseです。

Beanにlazy-init属性が指定されていない場合、常に熱心にインスタンス化されます。

21
zagyi

lazy-initはBeanの属性です。 lazy-initの値は、trueおよびfalseです。 lazy-initがtrueの場合の場合、そのBeanは、Beanへの要求が行われたときに初期化されます。このBeanは、スプリングコンテナが初期化され、lazy-initがfalseの場合、初期化されません。その後、Beanはスプリングコンテナの初期化で初期化されます。

3
Carl Massaad

要素の属性としてlazy-init = "default"を使用すると、コンテナはdefault-lazy-init = "true | false" attributeで指定された値を取得します要素のlazy-init = "true | false"として使用します。

Default-lazy-init属性が要素に存在しない場合、要素のlazy-init = "default"はlazy-init- "false"のように動作します。

1
Prashant_M