深刻理解-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());

相關文章
相關標籤/搜索