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