Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 Spring何时创建注入对象的实例_Java_Spring_Dependency Injection - Fatal编程技术网

Java Spring何时创建注入对象的实例

Java Spring何时创建注入对象的实例,java,spring,dependency-injection,Java,Spring,Dependency Injection,Spring执行DI并创建对象,这样您的程序就不必担心创建对象了。 但这里的问题是何时创建注入对象的实例。是在主程序使用实例时,还是在创建主程序实例时 当上下文启动时,上下文中的所有bean都被实例化、注入和初始化。当从上下文中检索到第一个bean时,所有bean都可以使用了 有两件事可以防止在上下文启动时初始化bean: bean使用scope=“xyz”属性配置了bean(例如prototype、request或session) 一个bean被标记为,在这种情况下,只有当它被显式地请求时,

Spring执行DI并创建对象,这样您的程序就不必担心创建对象了。
但这里的问题是何时创建注入对象的实例。是在主程序使用实例时,还是在创建主程序实例时

当上下文启动时,上下文中的所有bean都被实例化、注入和初始化。当从上下文中检索到第一个bean时,所有bean都可以使用了

有两件事可以防止在上下文启动时初始化bean:

  • bean使用
    scope=“xyz”
    属性配置了bean(例如
    prototype
    request
    session
  • 一个bean被标记为,在这种情况下,只有当它被显式地请求时,或者如果它作为某个其他bean的依赖项是必需的,它才会被实例化

默认情况下,ApplicationContext实现在初始化过程中急切地创建和配置所有单例bean。通常,这种预实例化是可取的,因为配置或周围环境中的错误会立即被发现,而不是数小时甚至数天之后。当这种行为不可取时,可以通过将bean定义标记为lazy initialized来防止单例bean的预实例化。惰性初始化bean告诉IoC容器在第一次请求时而不是在启动时创建bean实例


OP在评论中写道:

因此,由程序员决定bean是需要延迟初始化还是需要提前初始化。这可能是非常主观的,但您能告诉我在这种情况下遵循的最佳实践吗

是的,由程序员(或系统集成商)决定

实际上没有任何“最佳实践”规则来决定。这样想:

  • 如果在始终需要实例化bean时将其声明为延迟初始化,则可能会使启动过程变慢

  • 如果您在并不总是需要的时候声明一个bean是急切地初始化的,那么您将使启动过程变慢,并可能使用更多内存。在最坏的情况下,创建不必要的bean甚至可能导致启动失败


简而言之,您需要了解您的申请。

谢谢skaffman,这澄清了我的疑问。因此,由程序员决定bean是需要延迟初始化还是需要提前初始化。这可能是非常主观的,但是你能告诉我在这种情况下遵循的最佳实践吗?这完全是主观的,是的,但是软件构建的其余部分也是如此。这也不例外。但是您的默认位置应该是非惰性的,并且是默认范围。除非你有很好的理由,否则你只能做出一个豆子。我认为你可以(也应该)客观地做出这个决定。。。就像软件工程中的许多其他事情一样。我们往往没有足够的信息或脑力来做出客观的决定,这只是一个重大的决定。自从上一篇文章发表以来已经三年多了,我只是在寻找类似的问题时跳了出来。我的一个查询是,在上下文实例化时,它将只创建一个bean对象(如果我错了,请纠正我)。如果我在代码中自动连接同一个bean两次,第二个对象会被惰性地疯狂化吗?