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

时间:2010-01-18 08:13:03

标签: java spring dependency-injection

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

3 个答案:

答案 0 :(得分:13)

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

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

  • 使用prototype属性
  • ,bean使用different scope配置了bean(例如requestsessionscope="xyz"
  • bean已标记为lazy-init="true",在这种情况下,只有在明确要求时才会对其进行实例化,或者将其作为某个其他bean的依赖项进行实例化。

答案 1 :(得分:5)

在评论中,OP写道:

  

因此,程序员需要决定是否需要预先初始化或初始化bean。这可能是非常主观的,但是你可以让我知道在这种情况下所遵循的任何最佳实践。

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

决定没有任何“最佳实践”规则。想一想:

  • 如果将bean声明为懒惰的,当它总是需要实例化时,你可能会使启动过程变慢。

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

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

答案 2 :(得分:2)

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lazy-init

  

默认情况下,ApplicationContext实现会急切地创建和配置所有单例bean,作为初始化过程的一部分。通常,这种预先实例化是可取的,因为配置或周围环境中的错误是立即发现的,而不是几小时甚至几天后。如果不希望出现这种情况,可以通过将bean定义标记为延迟初始化来阻止单例bean的预实例化。延迟初始化的bean告诉IoC容器在第一次请求时创建一个bean实例,而不是在启动时。