深刻理解-Spring-之源码剖析IOC(二)

5. 如何建立Bean实例并构建Bean的依赖关系网bootstrap

咱们刚刚建立了Bean工厂,并建立 BeanDefinitions 放进Map里,以beanName为key。那么咱们如今有了Bean定义,但尚未实例,也没有构建Bean与Bean之间的依赖关系。ide

咱们知道,构建依赖关系是 IOC 的一个重要的任务,咱们怎么能放过。那么是在哪里作的呢?在 finishBeanFactoryInitialization(beanFactory) 方法中。该方法中重要的一步是 : beanFactory.preInstantiateSingletons(),咱们有必要看看该方法实现:this

 

@Overridespa

public void preInstantiateSingletons() throws BeansException {.net

if (this.logger.isDebugEnabled()) {debug

this.logger.debug("Pre-instantiating singletons in " + this);get

}it

 

// Iterate over a copy to allow for init methods which in turn register new bean definitions.io

// While this may not be part of the regular factory bootstrap, it does otherwise work fine.class

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)) {

final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);// 注意:FactoryBean

boolean isEagerInit;

if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {

isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>) () ->

((SmartFactoryBean<?>) factory).isEagerInit(),

getAccessControlContext());

相关文章
相关标签/搜索