什么时候实例化一个spring bean

ApplicationContext ctx = new ClassPathXmlApplicationContext( "com/springinaction/springidol/spring-idol.xml"); Performer performer = (Performer) ctx.getBean("duke"); performer.perform(); 

在上面,bean何时被实例化,何时创建ApplicationContext或者调用getBean()?

假设bean是单例,并且未配置为延迟初始化,则在上下文启动时创建它。 getBean()只是把它getBean()了。

Lazy-init bean仅在首次引用时初始化,但这不是默认值。 只有在第一次引用时才会创建范围内的bean(例如原型范围)。

根据Spring 文档 ,

ApplicationContext实现的默认行为是在启动时急切地预先实例化所有单例bean。

此外,您可以将它们设置为懒惰加载。

供参考,请参阅

  • 懒惰初始化的bean和
  • Bean范围

以下是创建bean时的简要说明:

  • 创建应用程序上下文时,将构造一个单独的bean(默认作用域),它不将lazy-init属性设置为true(默认为false)
  • 确实将lazy-init属性设置为true的单例bean在首次请求时构造
  • 在第一次请求时(对于该范围),将在任何其他范围内创建一个bean集。
  1. 默认情况下,所有bean都是单例,因此每当创建Application上下文时,它们都会被预加载。 具体来说,如果任何单例bean都有一个属性lazy-init =“true”set,它将是延迟加载的,即它将在第一次调用getBean方法时被实例化。

  2. 对于其他范围,bean将在请求时进行实例化。