我在考虑Spring中的bean的延迟初始化。对我而言,“懒惰”#34;这意味着将在引用bean时创建它。
我预计Spring中的延迟初始化支持是不同的。我认为这是一个"方法调用"基于懒惰的创作。我的意思是,无论何时在方法上调用任何方法,都会创建它。
我认为这可以通过创建特定bean的代理实例并在任何方法调用上进行初始化来轻松解决。
我错过了为什么没有实现这个问题?这个概念有什么问题吗?
任何反馈/想法/答案都将不胜感激。
谢谢你们!
答案 0 :(得分:3)
您可以通过0x08048bc2 <+46>: mov -0x8(%ebx),%eax
0x08048bc5 <+49>: add -0x4(%ebx),%eax
proxyMode
(CGLIB)或ScopedProxyMode.TARGET_CLASS
(JDK)来确定bean的范围。
例如
ScopedProxyMode.INTERFACES
将打印
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
bean中的Spring上下文注入的Foo
实例上调用了一个方法后,才通过@Bean
工厂方法初始化Foo
bean
Bar
注释也可以在类声明中使用。
答案 1 :(得分:-1)
贝洛是我的观点:
Spring容器中的Bean类型:
Spring容器中有两个 Scope bean类型。一个是 Prototype ,这个类型的bean不存在 lazy- init 概念,因为当客户端每次调用 getBean()方法 时,将实例化这些bean。另一个是 Singleton ,这些bean将被实例化一次,这些bean可以被懒惰地实例化(只是被实例化当它们被使用时,例如@Autowired,refrenced)如果你定义bean使用 @Lazy 或 lazy-init = true 。
如何实施 lazy-init :
是的,常见的实施方式是代理模式。 Spring使用 JDK动态代理和 Cglib 来实现代理,您可以进一步了解这些技术。
希望能帮到你。