Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对春天懒洋洋地实例化有些怀疑?它是如何工作的?_Java_Spring_Spring Mvc_Lazy Loading - Fatal编程技术网

Java 对春天懒洋洋地实例化有些怀疑?它是如何工作的?

Java 对春天懒洋洋地实例化有些怀疑?它是如何工作的?,java,spring,spring-mvc,lazy-loading,Java,Spring,Spring Mvc,Lazy Loading,我正在学习Spring Core认证,对此我有一些疑问: 在春季,默认情况下bean是延迟实例化还是急切实例化?怎么办 你改变了这种行为 因此,我知道默认情况下Spring容器会急切地实例化bean,并且我知道它会自动按照正确的顺序创建bean(声明到配置中),并注入依赖项。我知道,在依赖项注入之后,每个bean都会经历一个后处理阶段,在此阶段可能会进行进一步的配置和初始化。因此,在这个阶段结束时,我的bean已完全初始化并准备好使用 因此我认为,急切地进行bean实例化的含义是在应用程序启动之

我正在学习Spring Core认证,对此我有一些疑问:

在春季,默认情况下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,并指出以下断言:

支持惰性bean–仅在调用
getBean()
时创建。不 推荐,经常被误用:
@Lazy

因此,我想了解(我不确定)如果在我的Java代码中执行以下操作:

ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Hello hello = (Hello) appContext.getBean("hello"); 
id为hello的bean被延迟实例化。这是真的还是错的,还是遗漏了什么

如果从我阅读之前的文档所能理解的情况来看这是真的,那么使用之前的解决方案(为什么?)不是一个好主意,但是最好选择注释bean配置(到Java配置类中)必须使用
@Lazy
注释延迟实例化,或者使用
到(bean的)XML配置中

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


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

打开文档。Ctrl-F并键入“lazy”。点击链接。你会明白什么是懒惰,它是如何工作的,以及为什么它通常是个坏主意。您的代码显示了如何访问尚未实例化的bean:通过调用getBean(),它将实例化bean。在JavaConfig之前,我们使用查找方法,这与延迟实例化的bean非常匹配。还可以很好地解决生命周期不匹配问题。这个特性还没有被移植到JavaConfig,所以延迟实例化的bean已经成为一个很难使用的问题。