[英]Spring bean lazy initialization
我在考慮 Spring 中 bean 的延遲初始化。 對我來說,這里的“懶惰”意味着在引用 bean 時將創建 bean,這一點並不十分清楚。
我預計 Spring 中的延遲初始化支持是不同的。 我認為這是基於“方法調用”的懶惰創建。 我的意思是,每當在該方法上調用任何方法時,都會創建它。
我認為這可以通過創建特定 bean 的代理實例並在任何方法調用上進行初始化來輕松解決。
我是否錯過了為什么沒有實施的原因? 這個概念有問題嗎?
任何反饋/想法/答案將不勝感激。
您可以通過實現與一個范圍的豆你想要的行為proxyMode
的ScopedProxyMode.TARGET_CLASS
(CGLIB)或ScopedProxyMode.INTERFACES
(JDK)。
例如
public class StackOverflow {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Conf.class);
Bar bar = ctx.getBean(Bar.class);
System.out.println(bar);
System.out.println(bar.foo.toString());
}
}
@Configuration
class Conf {
@Bean
@Lazy
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public Foo foo() {
System.out.println("heyy");
return new Foo();
}
@Bean
public Bar bar() {
return new Bar();
}
}
class Bar {
@Autowired
public Foo foo;
}
class Foo {
}
將打印
com.example.Bar@3a52dba3
heyy
com.example.Foo@7bedc48a
證明只有在Bar
bean 中的 Spring 上下文注入的Foo
實例上調用了一個方法之后, Foo
bean 才通過其@Bean
工廠方法進行初始化。
@Scope
注解也可以在類聲明中使用。
以下是我的觀點:
Spring Container 中的 Bean 類型:
Spring Container中有兩種Scope bean類型,一種是Prototype ,這種類型的bean不存在lazy-init的概念,因為客戶端每次調用getBean()方法都會實例化這些bean。 另一個是Singleton ,這些 bean 將被實例化一次,如果使用@Lazy或lazy-init=true定義 bean,則這些 bean 可以延遲實例化(只需在使用時實例化,例如 @Autowired、 refrenced) 。
如何實現惰性初始化:
是的,常見的實現是Proxy Mode 。 Spring 使用JDK Dynamic Proxy和Cglib來實現Proxy ,您可以進一步了解這些技術。
希望能幫到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.