私は春の初心者です、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のデフォルトの動作は正確には何ですか?どのようにインスタンス化されますか?
デフォルトの動作はfalseです。
デフォルトでは、ApplicationContext実装は、初期化プロセスの一部としてすべてのシングルトンBeanを熱心に作成および構成します。通常、この事前インスタンス化が望ましいのは、構成または周囲の環境のエラーが数時間または数日後ではなく、すぐに発見されるためです。この動作が望ましくない場合、Bean定義を遅延初期化済みとしてマークすることにより、シングルトンBeanの事前インスタンス化を防ぐことができます。遅延初期化Beanは、起動時ではなく、最初に要求されたときにBeanインスタンスを作成するようにIoCコンテナーに指示します。
ここに来て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;
.......
}
beanのlazy-init="default"
設定は、囲んでいるbeans要素のdefault-lazy-init
属性によって設定されたもののみを参照します。 default-lazy-init
の暗黙のデフォルト値はfalse
です。
Beanにlazy-init
属性が指定されていない場合、常に熱心にインスタンス化されます。
lazy-initはBeanの属性です。 lazy-initの値は、trueおよびfalseです。 lazy-initがtrueの場合の場合、そのBeanは、Beanへの要求が行われたときに初期化されます。このBeanは、スプリングコンテナが初期化され、lazy-initがfalseの場合、初期化されません。その後、Beanはスプリングコンテナの初期化で初期化されます。
要素の属性としてlazy-init = "default"を使用すると、コンテナはdefault-lazy-init = "true | false" attributeで指定された値を取得します要素のlazy-init = "true | false"として使用します。
Default-lazy-init属性が要素に存在しない場合、要素のlazy-init = "default"はlazy-init- "false"のように動作します。