该系列学习笔记均是笔者通过学习某站雷丰阳老师的相关课程并结合 spring 2.* 版本源码自行整理出来的。如果有叙述不到位或者有误的地方烦请各位读者评论区给予指正,大家共同学习。
同时关于容器启动源码极为重要,未避免笔者水平误导读者,此处给出笔者认为写得很棒的一篇文章
Spring 容器的创建执行逻辑集中在 refresh 函数
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Spring 容器刷新前的预准备工作
prepareRefresh();
// 新建一个 beanFactory 并为其设置唯一 id 唯一标识
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 对新建的 beanFactory 进行预处理工作
prepareBeanFactory(beanFactory);
try {
// 依次调用 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 和 BeanFactoryPostProcessor::postProcessBeanFactory 方法
invokeBeanFactoryPostProcessors(beanFactory);
// 向容器中注册 BeanPostProcessor
registerBeanPostProcessors(beanFactory);
// 初始化 MessageSource 组件
initMessageSource();
// 初始化事件派发器
initApplicationEventMulticaster();
// 将项目中的所有 ApplicationListener 注册进入容器
registerListeners();
// 初始化所有剩下的单实例 bean
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
} catch (BeansException ex) {}
finally {}
}
}
- prepareRefresh() 进行 Spring 容器刷新前的预准备工作
protected void prepareRefresh() { // 记录容器的启动时间 this.startupDate = System.currentTimeMillis(); this.closed.set(false); this.active.set(true); // 验证 Spring 环境变量中属性的合法性 getEnvironment().validateRequiredProperties(); // 存储容器刷新前注册的本地 ApplicationListener if (this.earlyApplicationListeners == null) { this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners); } else { // 重置 applicationListeners this.applicationListeners.clear(); this.applicationListeners.addAll(this.earlyApplicationListeners); } // 新建 set 保存在事件派发器配置完成之前发布的事件 this.earlyApplicationEvents = new LinkedHashSet<>(); }
- obtainFreshBeanFactory() 用于获取 BeanFactory
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); return this.beanFactory; }
@Override protected final void refreshBeanFactory() throws IllegalStateException { this.beanFactory = new DefaultListableBeanFactory(); // 为新创建的 beanFactory 设置一个唯一 id this.beanFactory.setSerializationId(getId()); }
- prepareBeanFactory(beanFactory) 对新建的 beanFactory 进行预处理工作
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 设置 beanFactory 的类加载器、表达式解析器 beanFactory.setBeanClassLoader(getClassLoader()); beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); // 添加 ApplicationContextAwareProcessor implements BeanPostProcessor beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); // 设置容器中忽略的自动装配接口 beanFactory.ignoreDependencyInterface(EnvironmentAware.class); beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class); beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class); beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class); beanFactory.ignoreDependencyInterface(MessageSourceAware.class); beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); // 设置可以自动解析的自动装配 => 可以在任何组件中自动注入 beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); // 添加 ApplicationListenerDetector implements BeanPostProcessor // 用于检测添加到容器中的 Bean 对象是否 instanceof ApplicationListener beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)); // 注册默认环境 Bean => 可以在任何组件中自动注入 if (!beanFactory.containsLocalBean("environment")) { beanFactory.registerSingleton("environment", getEnvironment()); } if (!beanFactory.containsLocalBean("systemProperties")) { beanFactory.registerSingleton("systemProperties", getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean("systemEnvironment")) { beanFactory.registerSingleton("systemEnvironment", getEnvironment().getSystemEnvironment()); } }
- invokeBeanFactoryPostProcessors(beanFactory) 依次调用 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 和 BeanFactoryPostProcessor::postProcessBeanFactory 方法
public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>(); // 先获取容器中所有 BeanDefinitionRegistryPostProcessor String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { // 优先执行 list(BeanDefinitionRegistryPostProcessor) 中所有继承 PriorityOrdered if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); // 执行 currentRegistryProcessors 集合中所有继承 PriorityOrdered 的 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 方法 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); // 将 currentRegistryProcessors 集合清空,进行下一轮反射执行目标方法 currentRegistryProcessors.clear(); // 再执行 list(BeanDefinitionRegistryPostProcessor) 中所有继承 Ordered // 执行 currentRegistryProcessors 集合中所有继承 Ordered 的 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 方法 // 最后执行 list(BeanDefinitionRegistryPostProcessor) 中所有未继承上述两种接口 // 执行 currentRegistryProcessors 集合中所有未继承上述两种接口的 BeanDefinitionRegistryPostProcessor::postProcessBeanDefinitionRegistry 方法 else {} // 再获取容器中所有 BeanFactoryPostProcessor String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); // Separate between BeanFactoryPostProcessors that implement PriorityOrdered, Ordered, and the rest. List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); List<String> orderedPostProcessorNames = new ArrayList<>(); List<String> nonOrderedPostProcessorNames = new ArrayList<>(); sortPostProcessors(priorityOrderedPostProcessors, beanFactory); // 优先执行 list(BeanFactoryPostProcessor) 中所有继承 PriorityOrdered 的 BeanFactoryPostProcessor::postProcessBeanFactory invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); for (String postProcessorName : orderedPostProcessorNames) { orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } sortPostProcessors(orderedPostProcessors, beanFactory); // 再执行 list(BeanFactoryPostProcessor) 中所有继承 Ordered 的 BeanFactoryPostProcessor::postProcessBeanFactory invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } // 最后执行 list(BeanFactoryPostProcessor) 中所有未继承上述两种接口的 BeanFactoryPostProcessor::postProcessBeanFactory invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); }
- registerBeanPostProcessors(beanFactory) 注册 BeanPostProcessor
public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); // Separate between BeanPostProcessors that implement PriorityOrdered, Ordered, and the rest. List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); List<String> orderedPostProcessorNames = new ArrayList<>(); List<String> nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } sortPostProcessors(priorityOrderedPostProcessors, beanFactory); // 优先注册 PriorityOrdered 优先级接口的 BeanPostProcessor registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // 再注册 Ordered 接口的 BeanPostProcessor List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } sortPostProcessors(orderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, orderedPostProcessors); // 最后注册没有实现任何优先级接口的 BeanPostProcessors List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); sortPostProcessors(internalPostProcessors, beanFactory); // 再将 internalPostProcessors 集合中保存的 MergedBeanDefinitionPostProcessor 进行注册 registerBeanPostProcessors(beanFactory, internalPostProcessors); // 注册一个 ApplicationListenerDetector 用于检测 Bean 对象是否 implements ApplicationListener // 如果是 applicationContext.addApplicationListener((ApplicationListener<?>) bean) beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }
- initMessageSource() 初始化 MessageSource 组件(用于国际化,消息绑定,消息解析)
protected void initMessageSource() { // 获取之前创建的 beanFactory ConfigurableListableBeanFactory beanFactory = getBeanFactory(); // 判断容器中是否有 id = "messageSource" 的组件 if (beanFactory.containsLocalBean("messageSource")) { // 存在,则获取 id = "messageSource" class = MessageSource.class 的组件 this.messageSource = beanFactory.getBean("messageSource", MessageSource.class); if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) { HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource; if (hms.getParentMessageSource() == null) { hms.setParentMessageSource(getInternalParentMessageSource()); } } } else { // 容器中不存在则新建 DelegatingMessageSource,且注册进 beanFactory => 可以在任何组件注入 DelegatingMessageSource dms = new DelegatingMessageSource(); this.messageSource = dms; beanFactory.registerSingleton("messageSource", this.messageSource); } }
- initApplicationEventMulticaster() 初始化事件派发器
protected void initApplicationEventMulticaster() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); // 尝试从容器中获取 id = "applicationEventMulticaster" 的事件派发器 if (beanFactory.containsLocalBean("applicationEventMulticaster")) { this.applicationEventMulticaster = beanFactory.getBean("applicationEventMulticaster", ApplicationEventMulticaster.class); } else { // 获取失败,注入 id = "applicationEventMulticaster" 的事件派发器 this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); beanFactory.registerSingleton("applicationEventMulticaster", this.applicationEventMulticaster); } }
- registerListeners() 将项目中的所有 ApplicationListener 注册进入容器
protected void registerListeners() { // 获取容器中所有 ApplicationListener 类型的 Bean 即监听器 String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false); for (String listenerBeanName : listenerBeanNames) { // 将 ApplicationListener 添加到事件派发器 getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); } // 获取之前保存在事件派发器配置完成之前发布的事件的 set Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents; this.earlyApplicationEvents = null; if (earlyEventsToProcess != null) { for (ApplicationEvent earlyEvent : earlyEventsToProcess) { // 将这些 event 利用事件派发器发布 getApplicationEventMulticaster().multicastEvent(earlyEvent); } } }
- finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的单实例 bean
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // 初始化所有剩下的单实例 bean beanFactory.preInstantiateSingletons(); }
@Override public void preInstantiateSingletons() throws BeansException { // 获取容器中的所有 Bean,依次进行初始化和创建对象 List<String> beanNames = new ArrayList<>(this.beanDefinitionNames); for (String beanName : beanNames) { // 获取 Bean 的定义信息 RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); // 如果 Bean 对象 非抽象 单实例 非懒加载 if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { // if (beanInstance instanceof FactoryBean) if (isFactoryBean(beanName)) { // 通过 "&" + factoryBeanName 获取工厂本身的 Bean Object bean = getBean("&" + beanName); if (bean instanceof FactoryBean) { final FactoryBean<?> factory = (FactoryBean<?>) bean; else {} } } else { // 非工厂 bean 使用 genBean 创建 Bean 对象 getBean(beanName); } } } // 判断容器中的 bean 是否 instanceof SmartInitializingSingleton // 如果是,则执行 SmartInitializingSingleton::afterSingletonsInstantiated for (String beanName : beanNames) { Object singletonInstance = getSingleton(beanName); if (singletonInstance instanceof SmartInitializingSingleton) { final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance; smartSingleton.afterSingletonsInstantiated(); } } }
-
getBean(beanName) 创建 Bean 对象
@Override public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); }
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { final String beanName = transformedBeanName(name); Object bean; // 先获取缓存中保存的单实例 Bean // 如果能获取到说明这个 Bean之 前被创建过(所有创建过的单实例Bean都会被缓存起来) Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { // 获取失败,开始 Bean 的创建过程 // 首先标记当前 Bean 已经被创建,用于多线程情况 if (!typeCheckOnly) { markBeanAsCreated(beanName); } try { // 获取 Bean 的定义信息 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); // 获取当前 Bean 对象的依赖信息,需要先创建 Bean 的依赖 Bean String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { registerDependentBean(dep, beanName); try { // 存在依赖 Bean,先创建依赖 Bean 对象 getBean(dep); } catch (NoSuchBeanDefinitionException ex) {} } } // 创建单实例 Bean if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { // 创建单实例 Bean return createBean(beanName, mbd, args); } catch (BeansException ex) {} }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } } catch (BeansException ex) } // Check if required type matches the type of the actual bean instance. if (requiredType != null && !requiredType.isInstance(bean)) { try { T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType); return convertedBean; } catch (TypeMismatchException ex) {} } return (T) bean; }
- getSingleton(beanName, () -> { return createBean(beanName, mbd, args) }) 创建 Bean 对象并缓存
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { synchronized (this.singletonObjects) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { boolean newSingleton = false; try { // 利用函数式接口 getObject => createBean(beanName, mbd, args) 创建单实例 Bean singletonObject = singletonFactory.getObject(); newSingleton = true; } catch (IllegalStateException ex) {} catch (BeanCreationException ex) {} finally {} if (newSingleton) { // 将创建的 Bean 添加到缓存 singletonObjects 中 addSingleton(beanName, singletonObject); } } return singletonObject; } }
- getObject() => createBean(beanName, mbd, args) 创建单实例 Bean
@Override protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { RootBeanDefinition mbdToUse = mbd; try { // 利用 InstantiationAwareBeanPostProcessor::postProcessBeforeInstantiation 尝试获取当前 beanName 对应的代理对象 Object bean = resolveBeforeInstantiation(beanName, mbdToUse); if (bean != null) { // 若存在代理对象直接 return return bean; } } catch (Throwable ex) {} try { // 不存在代理对象,则创建单实例 Bean Object beanInstance = doCreateBean(beanName, mbdToUse, args); return beanInstance; } catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {} catch (Throwable ex) {} }
- doCreateBean(beanName, mbdToUse, args) 创建单实例 Bean
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // Instantiate the bean. BeanWrapper instanceWrapper = null; // 如果 Bean 对象为单实例 if (mbd.isSingleton()) { // 先尝试从缓存中获取 instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { // 获取失败则执行 Bean 对象构造方法 => 创建 Bean 对象 instanceWrapper = createBeanInstance(beanName, mbd, args); } // Initialize the bean instance. Object exposedObject = bean; try { // 为创建的 Bean 对象进行属性赋值 populateBean(beanName, mbd, instanceWrapper); // 执行 Bean 对象的初始化方法 exposedObject = initializeBean(beanName, exposedObject, mbd); } catch (Throwable ex) {} // Register bean as disposable. try { // 将单实例 Bean 对象加入到 list 中,在容器销毁时会调用这个 list 中所有 Bean 对象的销毁方法 registerDisposableBeanIfNecessary(beanName, bean, mbd); } catch (BeanDefinitionValidationException ex) {} return exposedObject; } protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { // 执行容器中所有的 BeanPostProcessor 执行其 postProcessBeforeInitialization 方法 wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); } try { // 执行 Bean 对象的初始化方法 invokeInitMethods(beanName, wrappedBean, mbd); } catch (Throwable ex) {} if (mbd == null || !mbd.isSynthetic()) { // 执行容器中所有的 BeanPostProcessor 执行其 postProcessAfterInitialization 方法 wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; }
- doCreateBean(beanName, mbdToUse, args) 创建单实例 Bean
- getSingleton(beanName, () -> { return createBean(beanName, mbd, args) }) 创建 Bean 对象并缓存
-
- finishRefresh() 完成 BeanFactory 的初始化创建工作 => IOC容器创建完成
protected void finishRefresh() { // 初始化和生命周期有关的后置处理器 initLifecycleProcessor(); // 获取之前的和生命周期有关的后置处理器,调用 onRefresh 方法 getLifecycleProcessor().onRefresh(); // 获取事件派发器,发布容器刷新完毕事件 publishEvent(new ContextRefreshedEvent(this)); }
- initLifecycleProcessor() 初始化和生命周期有关的后置处理器
protected void initLifecycleProcessor() { // 获取 beanFactory ConfigurableListableBeanFactory beanFactory = getBeanFactory(); // 判断 beanFactory 中是否存在 id = "lifecycleProcessor" 的组件 if (beanFactory.containsLocalBean("lifecycleProcessor")) { // 存在则获取 id = "lifecycleProcessor" 且 class = LifecycleProcessor.class 的组件 this.lifecycleProcessor = beanFactory.getBean("lifecycleProcessor", LifecycleProcessor.class); } else { // 不存在则新建 DefaultLifecycleProcessor 并设置 id = "lifecycleProcessor" DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor(); this.lifecycleProcessor = defaultProcessor; beanFactory.registerSingleton("lifecycleProcessor", this.lifecycleProcessor); } }
- initLifecycleProcessor() 初始化和生命周期有关的后置处理器