59

私はスプリング初心者で、コントロールの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 のデフォルトの動作は正確には何ですか? どのようにインスタンス化しますか?

4

5 に答える 5

74

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

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

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

于 2013-02-26T15:30:15.693 に答える
26

ここに来て Java 構成を使用している場合は、次のような注釈を使用して 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;

    .......
 }
于 2016-02-02T05:21:14.823 に答える
22

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

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

于 2013-02-26T15:29:38.947 に答える