簡體   English   中英

Spring bean 延遲初始化

[英]Spring bean lazy initialization

我在考慮 Spring 中 bean 的延遲初始化。 對我來說,這里的“懶惰”意味着在引用 bean 時將創建 bean,這一點並不十分清楚。

我預計 Spring 中的延遲初始化支持是不同的。 我認為這是基於“方法調用”的懶惰創建。 我的意思是,每當在該方法上調用任何方法時,都會創建它。

我認為這可以通過創建特定 bean 的代理實例並在任何方法調用上進行初始化來輕松解決。

我是否錯過了為什么沒有實施的原因? 這個概念有問題嗎?

任何反饋/想法/答案將不勝感激。

您可以通過實現與一個范圍的豆你想要的行為proxyModeScopedProxyMode.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 將被實例化一次,如果使用@Lazylazy-init=true定義 bean,則這些 bean 可以延遲實例化(只需在使用時實例化,例如 @Autowired、 refrenced)

如何實現惰性初始化

是的,常見的實現是Proxy Mode Spring 使用JDK Dynamic ProxyCglib來實現Proxy ,您可以進一步了解這些技術。

希望能幫到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM