Spring bean懒初始化

问题描述:

我在想Spring中bean的懒初始化。对我来说,这里的“懒惰”意味着一个bean被引用时会被创建,这并不是很清楚。Spring bean懒初始化

我期望Spring中的延迟初始化支持是不同的。我认为这是一个基于懒惰创建的“方法调用”。我的意思是,每当方法调用任何方法时,它都会被创建。

我认为这可以通过创建特定bean的代理实例并在任何方法调用上进行初始化来轻松解决。

我是否错过了为什么没有实现?这个概念有什么问题吗?

任何意见/想法/答案将不胜感激。

谢谢你们!

您可以通过使用ScopedProxyMode.TARGET_CLASS(CGLIB)或ScopedProxyMode.INTERFACES(JDK)的proxyMode作为您的bean的作用域来实现所需的行为。

例如

public class * { 
    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注释。

+0

你知道如何让懒惰加载这样的豆吗? “返回FactoryProvider()。getFactory()” – Fisk

波纹管是我的看法:

豆种在Spring容器:

有两个Spring容器范围豆型。一是原型,这种类型的bean将不存在lazy-init概念,因为这些bean将在客户端调用时实例化getBean()方法每次。另一种是辛格尔顿,这些bean将被实例化一次,这些bean可以懒洋洋地实例化(刚刚被实例化正在使用时,如@Autowired,refrenced)如果你定义bean使用@Lazylazy-init = true

如何实现延迟实例

是的,通常的做法是代理模式。弹簧使用JDK动态代理Cglib实施代理,你可以进一步了解这些技术。

希望能帮到你。