Spring bean延迟初始化

时间:2016-04-23 20:28:57

标签: java spring spring-aop spring-bean

我在考虑Spring中的bean的延迟初始化。对我而言,“懒惰”#34;这意味着将在引用bean时创建它。

我预计Spring中的延迟初始化支持是不同的。我认为这是一个"方法调用"基于懒惰的创作。我的意思是,无论何时在方法上调用任何方法,都会创建它。

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

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

任何反馈/想法/答案都将不胜感激。

谢谢你们!

2 个答案:

答案 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 来实现代理,您可以进一步了解这些技术。

希望能帮到你。