韩国网页游戏网站,网站做301将重定向到新域名,创新的品牌网站建设,江苏建设工程信息网一体化平台在文章Springboot3.3.5 启动流程#xff08;源码分析#xff09;中我们只是粗略的介绍了bean 的装配(Bean的定义)流程和实例化流程分别开始于 finishBeanFactoryInitialization 和 preInstantiateSingletons. 其实,在Spring boot中#xff0c;Bean 的装配是多阶段的#xf…在文章Springboot3.3.5 启动流程源码分析中我们只是粗略的介绍了bean 的装配(Bean的定义)流程和实例化流程分别开始于 finishBeanFactoryInitialization 和 preInstantiateSingletons. 其实,在Spring boot中Bean 的装配是多阶段的 复杂的。 本文将从五个方面介绍 bean 的装配和实例化当然启动过程中还有一些零散的 bean 的创建这里就不做过多介绍。 目录 5 个 RootBean 创建流程应用程序主类bean 创建流程SpringBootApplication标注的类应用程序其它bean的创建流程AutoConfiguration bean 加载流程初始化非懒加载的 bean 5 个 RootBean 创建流程
ConfigurationAnnotationProcessor、 AutowiredAnnotationProcessor 、 CommonAnnotationProcessor EventListenerProcessor 、EventListenerFactory这5个 Bean 的创建是随着 AnnotationConfigServletWebServerApplicationContext 的创建而创建的。
在文章 Springboot启动流程之ApplicationContext 创建 可以看到创建 AnnotationConfigServletWebServerApplicationContext 的同时也创建了 AnnotatedBeanDefinitionReader 和 ClassPathBeanDefinitionScanner. 从名字可以看出一个是用于读取 注解 标注的 bean 定义 一个用于扫描 类路径下 bean 的定义。
在初始化 AnnotatedBeanDefinitionReader的同时 调用 AnnotationConfigUtils 的方法 registerAnnotationConfigProcessors 注册了以上 5 个bean以下是源码信息 根据以上描述 整理出其创建时序图如下
应用程序主类bean 创建流程SpringBootApplication标注的类
应用程序主类 bean的创建是在 SpringApplication.prepareContext 的 load 方法中
其最终是在BeanDefinitionReaderUtils.registerBeanDefinition 调用 AnnotationConfigServletWebServerApplicationContext .registerBeanDefinition 完成注册
SpringBootApplication 标注主类 bean 注册的详细流程如下
应用程序其它bean的创建流程
应用程序其它 bean 的创建起始于 refreshContext 环节最终通过 ConfigurationClassParse.parse 扫描特定包下面的 bean。 应用程序 bean 创建流程时序图如下
AutoConfiguration bean 加载流程
在 Springboot 中一个应用程序通常都需要依赖其它一些组件而且在应用中我们只需要定义好依赖的组件我们就能够使用组件提供的服务这是通过 Spring boot 的自动加载机制实现的。
我们知道要实现自动加载 只需要定义好 服务、自动配置类、自动配置条件然后将自动配置类的完整路径AutoConfiguration标注的类放到 resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports SpringBoot3才支持文件中即可。
在 Spring boot 源码中文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 是通过 ImportCondidates.load 加载所有的自动配置类的其详细源码如下
同应用程序 bean 一样自动配置 bean 也是在 refreshContext 环节完成的,其详细流程如下
初始化非懒加载的 bean
在这之前所有需要的 bean 信息就加载完成了接下来就是初始化所有未初始化的单例 bean singleton bean。
在源码中 每个 bean 的初始化是通过反射实现的其源码如下
在springboot 中bean的初始化是多种多样的 可以是无参构造函数、有参构造函数、工厂方法、自动注入的构造函数等等… 下面是不分源码
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Nullable Object[] args) {...if (args null) {Supplier? instanceSupplier mbd.getInstanceSupplier();if (instanceSupplier ! null) {return obtainFromSupplier(instanceSupplier, beanName, mbd);}}if (mbd.getFactoryMethodName() ! null) {return instantiateUsingFactoryMethod(beanName, mbd, args);}...if (resolved) {if (autowireNecessary) {return autowireConstructor(beanName, mbd, null, null);}else {return instantiateBean(beanName, mbd);}}// Candidate constructors for autowiring?Constructor?[] ctors determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors ! null || mbd.getResolvedAutowireMode() AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {return autowireConstructor(beanName, mbd, ctors, args);}// Preferred constructors for default construction?ctors mbd.getPreferredConstructors();if (ctors ! null) {return autowireConstructor(beanName, mbd, ctors, null);}// No special handling: simply use no-arg constructor.return instantiateBean(beanName, mbd);}Bean 初始化详细流程如下
总结
本文以 AnnotationConfigServletWebServerApplicationContext 为基础介绍了 一个应用 所需的bean的创建流程。从整个启动生命周期来看refreshContext 结束后所有的bean 都加载好了。Springboot 中 bean 的创建是多阶段的复杂的如果应用依赖于 srpingboot 启动生命周期一定要关注相关 bean 的创建时机。
Spring boot 启动时 Bean创建流程就介绍完了希望对各位小伙伴有所帮助。