什么时候实例化一个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集。
-
默认情况下,所有bean都是单例,因此每当创建Application上下文时,它们都会被预加载。 具体来说,如果任何单例bean都有一个属性lazy-init =“true”set,它将是延迟加载的,即它将在第一次调用getBean方法时被实例化。
-
对于其他范围,bean将在请求时进行实例化。