ApplicationContext ctx = new ClassPathXmlApplicationContext(
"com/springinaction/springidol/spring-idol.xml");
Performer performer = (Performer) ctx.getBean("duke");
performer.perform();
在上面,bean何时被实例化,何时创建ApplicationContext或者调用getBean()?
答案 0 :(得分:37)
假设bean是单例,并且没有配置为延迟初始化,那么它是在启动上下文时创建的。 getBean()
只是把它捞出来。
Lazy-init bean仅在首次引用时初始化,但这不是默认值。只有在第一次引用时才会创建范围内的bean(例如原型范围)。
答案 1 :(得分:13)
答案 2 :(得分:9)
供参考,见
以下是关于何时创建bean的简要说明:
答案 3 :(得分:1)
默认情况下,所有bean都是单例,因此每当创建Application上下文时,它们都会被预加载。具体来说,如果任何单例bean都有一个属性lazy-init =“true”set,它将是延迟加载的,即它将在第一次调用getBean方法时被实例化。
对于其他范围,只要请求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的优点,它可以解决循环依赖问题。