关于Spring中懒惰实例化的一些疑问?这个怎么运作?

时间:2015-03-15 09:22:10

标签: java spring spring-mvc lazy-loading

我正在攻读Spring Core认证,我对这些问题有些怀疑:

  

在Spring中,默认情况下懒惰或急切地实例化bean?怎么做   你改变了这种行为吗?

所以我知道默认情况下,Spring容器会急切地实例化bean,我知道它会以正确的顺序自动创建我的bean(声明为配置)并注入依赖项。我知道在依赖注入之后,每个bean都经历了一个后处理阶段,其中可能会发生进一步的配置和初始化。所以在这个阶段结束时,我的bean已经完全初始化并可以使用了。

所以我认为急切的bean实例化的含义是在应用程序启动之前创建声明的bean的行为。是对的还是我错过了什么?

相反,延迟初始化是延迟创建对象,计算值或其他一些昂贵流程的策略,直到第一次需要它为止。

所以我首先怀疑它。这是一个classi Java应用程序(不使用Spring)的相同行为,在程序执行的某个时刻,我声明一个这样的语句:

private void myMethod() {
    ....................................
    ....................................
    ....................................
    DO SOMETHING
    ...................................
    MyObject myObject = new MyObject();    // Is it lazily instantiated?
    ....................................
    ....................................
}

所以在上一个片段的情况下,它是 MyObject myObject 懒惰地实例化(在我的应用程序启动之前没有实例化它,但是它在应用程序执行的某一点被实例化)或者我是遗失了什么?

顺便回到最初的问题:如何更改默认行为以及如何以懒惰的方式实例化bean?

阅读课程文档,我发现Spring支持Lazy beans,它说这个断言:

  

支持Lazy beans - 仅在调用getBean()时创建。不   推荐,经常被滥用:@Lazy<bean lazy-init=“true” ...>

所以我要明白(我不确定)如果我的Java代码中有以下内容:

ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Hello hello = (Hello) appContext.getBean("hello"); 

id hello 的bean 懒惰地实例化。它是真的还是错的或遗漏了什么?

如果从我能理解的内容中读取前面的文档是正确的,那么使用之前的解决方案(为什么?)并不是一个好主意,但最好选择注释必须的bean配置(到Java配置类)使用@Lazy注释进行懒惰实例化或使用<bean lazy-init=“true” ...>进入(bean的)XML配置。

因此,这意味着Spring中的@Lazy可以在@Configuration类中使用。已使用@Lazy注释声明的bean不会被spring容器初始化。只有当代码中的某个地方访问该bean时,@Lazy才会被容器初始化。

好的,但现在我的疑问是:如何访问尚未实例化的bean?你能告诉我一个例子吗?

0 个答案:

没有答案