繁体   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