赞
踩
这个问题看似简单实则坑多。
那么究竟哪个正确呢?其实这么回答都不正确,spring对bean的初始化其实是有条件的。
首先判断是单例还是多例,如果是多例的情况下,肯定是在你第一次使用该bean的时候初始化无疑。
但是如果是单例的情况下又分为两种情况:
lazy-init
懒加载设置为true
时是在你第一次使用的时候实例化;第一次使用包括的范围是此对象被其它bean
引用也算第一次使用,所以即使你设置lazy-init
为ture
只要你的此bean
被引用或者注入也会被初始化。lazy-init
懒加载为false
时(这也是spring默认值
)是在spring容器启动时进行实例化。以下我们来看下spring实例化bean的源码你就知道了
查看AbstractApplicationContext.refresh()
方法中实例化所有非懒加载的bean
过程即
这个方法finishBeanFactoryInitialization
查看此方法最后一行beanFactory.preInstantiateSingletons();
实际调用此方法我们来看此单例实例化过程
为DefaultListBeanFactory.preInstantiateSingletons
源码如下
public void preInstantiateSingletons() throws BeansException {
//此处省略无数行代码。。。。。
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
//此处做出了判断必须是非抽象的并且必须是单例的并且必须是非懒加载的。
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
//此处省略无数行代码
}
}
//此处省略无数行代码
}
从以上代码的循环中的条件我们不难看出容器启动过程中会实例化的bean
只有满足以下三个条件的bean
:
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。