这里写目录标题
- 1.Spring boot 简介
- 2.@SpringBootApplication注解分析
- 3.剖析代码
1.Spring boot 简介
Spring Boot是由Pivotal团队提供的快速开发框架,基于SpringMVC通过注解+内置Http服务器如:tomcat-embed-core,简化了XML配置,快速将一些常用的第三方依赖整合(通过Maven继承依赖关系),最终实现以Java应用程序的方式进行执行。
Spring Boot 包含的特性如下:
- 创建可以独立运行的 Spring 应用
- 直接嵌入 Tomcat 或 Jetty 服务器,不需要部署 WAR 文件
- 提供推荐的基础 POM 文件来简化 Apache Maven 配置
- 尽可能的根据项目依赖来自动配置 Spring 框架
- 提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查
- 没有代码生成,也没有 XML 配置文件
Spring boot 加载
因为 Spring boot 内置了 Tomcat 或 Jetty 服务器,不需要直接部署 War 文件,所以 spring boot 的程序起点为一个普通的主函数,主函数类如下:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
看似和普通的程序没有什么区别,其实他最主要的步骤都通过注解 @SpringBootApplication 和方法 SpringApplication.run() 完成了。
SpringBoot启动流程
2.@SpringBootApplication注解分析
以下是注解@SpringBootApplication的源码实现
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration // 注解一
@EnableAutoConfiguration // 注解二
// 没有配置 basepackages,默认代表当前包及其子包
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM,
classes = AutoConfigurationExcludeFilter.class) }) // 注解三
public @interface SpringBootApplication {
// ...
}
注解一代表配置注解,如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}
有了这个注解,我们就可以把由 @SpringBootApplication 注解修饰的类作为配置类来使用,即在类 DemoApplication 中由 @Bean 注解修饰的代码都会被注入到 IoC 容器中由 Spring 统一管理。
注解三会自动扫描该类所在包,将各种组件注入到 IoC 容器中让其管理,所以我们也可以类 DemoApplication 上增加诸如 @Controller 的注解,将其作为一个 Controller。
@EnableAutoConfiguration
我们注意到 SpringBootApplication 注解同时由 @EnableAutoConfiguration 注解修饰,我们继续看 @EnableAutoConfiguration。
@EnableAutoConfiguration 的定义如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage // 注解一
@Import(AutoConfigurationImportSelector.class) // 注解二
public @interface EnableAutoConfiguration {
}
3.剖析代码
查看SpringApplication的源代码可以发现SpringApplication的启动由两部分组成;
- new SpringApplication(primarySources):创建SpringApplication对象
- run(args):调用run方法
3.1实例化SpringApplication对象
源码如下:
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
this.resourceLoader = resourceLoader;//1、初始化资源加载器
Assert.notNull(primarySources, "PrimarySources must not be null");//2、断言资源加载类不能为 null
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));//3、初始化加载资源类集合并去重
this.webApplicationType = deduceWebApplicationType();//4、 推断应用类型是Standard还是Web
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));//5、设置应用上下文初始化器
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));//6、设置监听器
this.mainApplicationClass = deduceMainApplicationClass();//7、推断应用入口类
}