Spring bean懒初始化
问题描述:
我在想Spring中bean的懒初始化。对我来说,这里的“懒惰”意味着一个bean被引用时会被创建,这并不是很清楚。Spring bean懒初始化
我期望Spring中的延迟初始化支持是不同的。我认为这是一个基于懒惰创建的“方法调用”。我的意思是,每当方法调用任何方法时,它都会被创建。
我认为这可以通过创建特定bean的代理实例并在任何方法调用上进行初始化来轻松解决。
我是否错过了为什么没有实现?这个概念有什么问题吗?
任何意见/想法/答案将不胜感激。
谢谢你们!
答
您可以通过使用ScopedProxyMode.TARGET_CLASS
(CGLIB)或ScopedProxyMode.INTERFACES
(JDK)的proxyMode
作为您的bean的作用域来实现所需的行为。
例如
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 {
}
将打印
[email protected]
heyy
[email protected]
证明该Foo
豆通过后,才一个方法是在Foo
例如,通过在Spring上下文注入援引其@Bean
工厂方法初始化Bar
豆。可以在类声明中使用@Scope
注释。
答
波纹管是我的看法:
豆种在Spring容器:
有两个在Spring容器范围豆型。一是原型,这种类型的bean将不存在lazy-init概念,因为这些bean将在客户端调用时实例化getBean()方法每次。另一种是辛格尔顿,这些bean将被实例化一次,这些bean可以懒洋洋地实例化(刚刚被实例化正在使用时,如@Autowired,refrenced)如果你定义bean使用@Lazy或lazy-init = true。
如何实现延迟实例:
是的,通常的做法是代理模式。弹簧使用JDK动态代理和Cglib实施代理,你可以进一步了解这些技术。
希望能帮到你。
你知道如何让懒惰加载这样的豆吗? “返回FactoryProvider()。getFactory()” – Fisk