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());