publicvoidpreInstantiateSingletons()throwsBeansException{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.// 得到所有的Bean名字List<String> beanNames =newArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...for(String beanName : beanNames){// 获取合并(xml方式配置parent=另一个BeanName)后的BeanDefinition,并放入mergedBeanDefinitions这个Map中RootBeanDefinition bd =getMergedLocalBeanDefinition(beanName);// 不是抽象的BeanDefinition(xml方式配置abstract=true),并且它是单例的,并且他不是懒加载的if(!bd.isAbstract()&& bd.isSingleton()&&!bd.isLazyInit()){// FactoryBean的逻辑if(isFactoryBean(beanName)){// 获取FactoryBean对象(类对象)Object bean =getBean(FACTORY_BEAN_PREFIX + beanName);// 他是FactoryBeanif(bean instanceofFactoryBean){// 强转为FactoryBeanFactoryBean<?> factory =(FactoryBean<?>) bean;// 是否要初始化的判断标志boolean isEagerInit;// 当他实现了SmartFactoryBean的时候,并且重写的isEagerInit为true才会吧isEagerInit设置为true,进行getObject()的Bean的创建if(System.getSecurityManager()!=null&& factory instanceofSmartFactoryBean){
isEagerInit =AccessController.doPrivileged((PrivilegedAction<Boolean>)((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else{
isEagerInit =(factory instanceofSmartFactoryBean&&((SmartFactoryBean<?>) factory).isEagerInit());}if(isEagerInit){// 创建真正的Bean对象(getObject()返回的对象)getBean(beanName);}}}else{// 创建Bean对象getBean(beanName);}}}// 所有的非懒加载单例Bean都创建完了后// Trigger post-initialization callback for all applicable beans...for(String beanName : beanNames){// 找到当前beanName对应的单例对象Object singletonInstance =getSingleton(beanName);// 所有的非懒加载单例Bean创建完成之后,调用当前Bean实现了SmartInitializingSingleton接口的方法。针对单个Beanif(singletonInstance instanceofSmartInitializingSingleton){// 一个计时器开始位置StartupStep smartInitialize =this.getApplicationStartup().start("spring.beans.smart-initialize").tag("beanName", beanName);// 强转为我们的实现类SmartInitializingSingleton smartSingleton =(SmartInitializingSingleton) singletonInstance;// 通过JDK的安全处理器方式调用这个Bean重写的方法if(System.getSecurityManager()!=null){AccessController.doPrivileged((PrivilegedAction<Object>)()->{
smartSingleton.afterSingletonsInstantiated();returnnull;},getAccessControlContext());}else{// 直接调用这个Bean重写的方法
smartSingleton.afterSingletonsInstantiated();}// 一个计时器结束位置
smartInitialize.end();}}}
判断是否是FactoryBean源码分析
publicbooleanisFactoryBean(String name)throwsNoSuchBeanDefinitionException{String beanName =transformedBeanName(name);// 找到当前beanName对应的单例对象:Object beanInstance =getSingleton(beanName,false);// 不为空的时候,直接返回他是否属于FactoryBeanif(beanInstance !=null){return(beanInstance instanceofFactoryBean);}// No singleton instance found -> check bean definition.// 走到这里说明没有拿到,只能根据BeanDefinition进行判断。// 当前容器beanDefinitionMap中没有当前Bean并且父BeanFactory是配置类if(!containsBeanDefinition(beanName)&&getParentBeanFactory()instanceofConfigurableBeanFactory){// No bean definition found in this factory -> delegate to parent.// 返回父BeanFactory的isFactoryBean。return((ConfigurableBeanFactory)getParentBeanFactory()).isFactoryBean(name);}// 当前容器中包含这个Bean,判断当前Bean是否是FactoryBean,走这个方法判断returnisFactoryBean(beanName,getMergedLocalBeanDefinition(beanName));}/**
* 当前容器中包含这个Bean,判断当前Bean是否是FactoryBean
*/protectedbooleanisFactoryBean(String beanName,RootBeanDefinition mbd){// 看这个BeanDefinition的isFactoryBean属性,是否是值Boolean result = mbd.isFactoryBean;if(result ==null){// 获取BeanDefinition的beanClass属性,没有就去加载这个具体的Bean(依赖注入的时候去深入分析这个方法)Class<?> beanType =predictBeanType(beanName, mbd,FactoryBean.class);// 判断是不是实现了FactoryBean接口
result =(beanType !=null&&FactoryBean.class.isAssignableFrom(beanType));// 设置到当前BeanDefinition的isFactoryBean属性
mbd.isFactoryBean = result;}// 拿到返回值return result;}