[英]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.