我正在攻读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?你能告诉我一个例子吗?