Spring Bean
的创建刚开始进行了一些准备工作,比如转换服务的初始化,占位符解析器的初始化, BeanDefinition
元数据的冻结等操作,都是为了在创建Bean的过程中保证 Bean
的正确的创建,接下来开始进行对 Bean
的创建进行解析。
Bean 的创建步骤
在 Spring
源码中对 Bean
的创建遵循一个步骤就是: getBean
--> doGetBean
--> createBean
--> doCreateBean
,常规的 Bean
的创建过程都是按照这个步骤执行,然后反射实例化,属性填充,初始化,放到一级缓存中。那么非常规的有可能就不遵循这个步骤,比如 FactoryBean
, InstantiationAwareBeanPostProcessor
等。
上源码:
public void preInstantiateSingletons() throws BeansException { 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. List<String> beanNames = new ArrayList<>(this.beanDefinitionNames); // Trigger initialization of all non-lazy singleton beans... // 遍历所有的beanName for (String beanName : beanNames) { // 获取RootBeanDefinition 从缓存中,第一个放入缓存是在 AbstractApplicationContext#invokeBeanFactoryPostProcessors 中的getBeanNamesForType方法中 RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); // 如果不是抽象的,是单例的,是非懒加载的,则进行bean的创建,否则直接跳过 if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { // 是否是FactoryBean if (isFactoryBean(beanName)) { // 获取bean实例 Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); // 判断获取的Bean是否是FactoryBean if (bean instanceof FactoryBean) { FactoryBean<?> factory = (FactoryBean<?>) bean; // 是否是饥饿初始化,默认是false boolean isEagerInit; // 权限校验 if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { isEagerInit = AccessController.doPrivileged( (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit, getAccessControlContext()); } else { isEagerInit = (factory instanceof SmartFactoryBean && ((SmartFactoryBean<?>) factory).isEagerInit()); } // 如果是饥饿初始化,则进行bean的创建 if (isEagerInit) { getBean(beanName); }