一、主類:
二、配置類:
三、singleton bean的創(chuàng)建流程
運(yùn)行到context.refresh();
進(jìn)入refresh方法:
向下運(yùn)行到紅線位置時(shí):
會(huì)實(shí)例化所有的singleton bean.進(jìn)入finisheBeanFactoryInitialization方法:
向下拖動(dòng)代碼,可以看到beanFactory.preInstantiateSingletons();
進(jìn)入preInstantiateSingletons方法:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-600333.html
public void preInstantiateSingletons() throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
// Iterate over a copy to allow for init methods which in turn register new bean definitions.
// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// Trigger initialization of all non-lazy singleton beans...
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof FactoryBean) {
final FactoryBean<?> factory = (FactoryBean<?>) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
((SmartFactoryBean<?>) factory)::isEagerInit,
getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}
}
}
else {
getBean(beanName);
}
}
}
// Trigger post-initialization callback for all applicable beans...
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null;
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
}
}
}
可以看到實(shí)例化singleton bean的代碼:
可以看到對(duì)非abstract、singleton的、非懶加載的bean,則會(huì)調(diào)用getBean方法創(chuàng)建bean并緩存(getBean方法的流程不再詳述)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-600333.html
到了這里,關(guān)于spring復(fù)習(xí):(50)@Configuration注解配置的singleton的bean是什么時(shí)候被創(chuàng)建出來(lái)并緩存到容器的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!