什么时候实例化一个spring bean

时间:2010-12-15 19:50:08

标签: java spring

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

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

7 个答案:

答案 0 :(得分:37)

假设bean是单例,并且没有配置为延迟初始化,那么它是在启动上下文时创建的。 getBean()只是把它捞出来。

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

答案 1 :(得分:13)

根据Spring documentation

  

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

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

答案 2 :(得分:9)

供参考,见

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

  • 在创建应用程序上下文时构造没有将lazy-init属性设置为true(默认为false)的单例bean(默认作用域)
  • 首次请求将lazy-init属性设置为true的单例bean构建
  • 首次请求时,会在任何其他范围内创建一个bean(对于该范围)。

答案 3 :(得分:1)

  1. 默认情况下,所有bean都是单例,因此每当创建Application上下文时,它们都会被预加载。具体来说,如果任何单例bean都有一个属性lazy-init =“true”set,它将是延迟加载的,即它将在第一次调用getBean方法时被实例化。

  2. 对于其他范围,只要请求bean,就会实例化。

答案 4 :(得分:0)

默认情况下,它是在上下文启动时创建的,但是顺序取决于依赖关系。 如果我们有以下课程:

@Component
public  class A{

}

@Component
public class B{
    @Autowired
    A a;

}

将在B类之前创建A类,因为B类依赖于A类。

答案 5 :(得分:0)

默认情况下,Spring ApplicationContext会在应用程序启动过程中积极创建并初始化所有“单个作用域” bean。 ApplicationContext使Bean在BeanFactory中可用。 getBean()返回bean的实例。

答案 6 :(得分:0)

这取决于您使用getBean()方法调用的bean的范围是什么。 如果是“ Singleton”,则由ApplicationContext预先实例化。

如果将BeanFactory用作IOC容器,则它使用延迟初始化,并且只有在调用getBean()方法时才会实例化Bean。

与BeanFactory相比,这是ApplicationContext的优点,它可以解决循环依赖问题。