springboot的启动_springboot启动加载
大家好,又见面了,我是你们的朋友全栈君。
总括:
@SpringBootApplication 包含@Configuration所以启动类是一个xml
注解除了有标志作用,还需有复杂类的切面作用可以用@import @Import(EnableAutoConfigurationImportSelector.class)
将配置中的类ioc实例化到容器,然后创建上下文,将实例化的bean放入上下文
正文
说springboot的启动流程当然少不了springboot启动入口类
@SpringBootApplication
public class SpringBootWebApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringBootWebApplication.class);
application.run(args);
}
}
以上代码很容易看出哪些是关键,当然是@SpringBootApplication和application.run()分别是springboot加载配置和启动,下面详细说明这两块。
1.SpringBootApplication的背后
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
其中@Configuration(@SpringBootConfiguration中其实用的也是@Configuration);@EnableAutoConfiguration;@ComponentScan三个是最重要的注解,@SpringBootApplication整合了三个注解使用者写起来看起来都比较简洁。
1.1@Configuration
它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。如下案例说明xml和注解实现bean的定义
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">
<!--bean定义-->
</beans>
1.2@EnableAutoConfiguration
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@EnableAutoConfiguration简单的说它的作用就是借助@Import的支持,收集和注册特定场景相关的bean定义。其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持很智能的自动配置:
SpringFactoriesLoader其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。(如下页面模版的配置)
1.3springboot启动简单流程
1.3.1 当我们运行SpringApplication的main方法时,调用静态方法run()首先是实例化,SpringApplication初始化的时候主要做主要做三件事:
- 根据classpath下是否存在(ConfigurableWebApplicationContext)判断是否要启动一个web applicationContext。
- SpringFactoriesInstances加载classpath下所有可用的ApplicationContextInitializer
- SpringFactoriesInstances加载classpath下所有可用的ApplicationListener
1.3.2 SpringApplicatio实例化完成并且完成配置后调用run()方法,首先遍历初始化过程中加载的SpringApplicationRunListeners,然后调用starting(),开始监听springApplication的启动。
1.3.3 加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment。将配置环境(Environment)加入到监听器对象中(SpringApplicationRunListeners)。
1.3.4 banner属性的设置
1.3.5 ConfigurableApplicationContext(应用配置上下文)创建,根据webEnvironment是否是web环境创建默认的contextClass ,AnnotationConfigEmbeddedWebApplicationContext(通过扫描所有注解类来加载bean)和ConfigurableWebApplicationContext),最后通过BeanUtils实例化上下文对象,并返回。
1.3.6 prepareContext()方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联。
1.3.7 refreshContext(context),bean的实例化完成IoC容器可用的最后一道工序。
1.3.8 最后springboot做一些收尾工作。自此springboot的简单流程到此结束。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171561.html原文链接:https://javaforall.cn
相关文章
- Java项目毕业设计:基于springboot+vue的电影视频网站系统「建议收藏」
- SpringBoot的启动流程_springboot启动卡住了
- spring boot tomcat 版本_springboot命令行启动
- Springboot 启动扩展点
- springBoot跨域注解@CrossOrigin
- dubbo负载均衡策略(XML、注解、SpringBoot配置)「建议收藏」
- springboot启动后自动停止_redis启动停止重启
- springboot的启动流程图_@SpringBootApplication
- springboot 启动的时候加载外部配置文件_java读取外部配置文件
- 【SpringBoot】41、SpringBoot中使用脚本命令启动、停止程序「建议收藏」
- SpringBoot同一个服务多个端口启动
- springboot升级2.6+启动报错:Failed to start bean ‘documentationPluginsBootstrapper’
- idea创建springboot父子工程_Springboot框架
- springBoot整合Mybatis-Plus需要的依赖_springboot中文手册
- SpringBoot项目启动后再请求远程接口的实现方式
- SpringBoot使用AOP详解
- 这样优化,0.059s启动一个SpringBoot项目!
- SpringBoot中很好玩的一个banner启动控制台效果
- SpringBoot 验证码生成+SMTP邮箱服务配置
- SpringBoot Application事件监听的实现方案(动态写入yml)
- IntelliJ IDEA使用spring Initializr快速构建SpringBoot项目
- 【ES三周年】SpringBoot整合elasticsearch存储抖音短视频数据实践
- SpringBoot(一)走进Springboot的世界详解编程语言
- springboot+redis实现分布式session共享详解编程语言