共计 2436 个字符,预计需要花费 7 分钟才能阅读完成。
导读 | Spring Boot 是伴随着 Spring4.0 共同诞生的,它的目的就是简化 spring 的配置及开发,并协助开发人员可以整体管理应用程序的配置而不再像以前那样需要做大量的配置工作,它提供了很多开发组件,并且内嵌了 web 应用容器,如 tomcat 和 Jetty 等。其目的便是使我们的开发变得简化并且能大幅度提高开发人员的开发效率,为了简化 Spring 功能的配置我们可以引入或启动我们需要的 Spring 功能。这样做的好处就是避免开发人员过多的对框架的关注,而把更多的精力与时间放在系统的业务逻辑代码中。 |
它是一个服务于 spring 框架的框架,能够简化配置文件,快速构建 web 应用,
内置 tomcat,无需打包部署,直接运行。
maven 的目录结构
a) 默认有 resources 文件夹存放配置文件
b) 默认打包方式为 jar
spring-boot-starter-web 中默认包含 spring mvc 相关依赖以及内置的 tomcat 容器,使得构建一个 web 应用更加简单
默认提供 application.properties/yml 文件
默认通过 spring.profiles.active 属性来决定运行环境时读取的配置文件
EnableAutoConfiguration 默认对于依赖的 starter 进行自动
SpringBootApplication 本质上是由 3 个注解组成,分别是
@Configuration
@EnableAutoConfiguration
@ComponentScan
@Configuration:
在启动类里面标注了 @Configuration,意味着它其实也是一个 IoC
容器的配置类
@EnableAutoConfiguration:
springboot 应用把所有符合条件的 @Configuration 配置
都加载到当前 SpringBoot 创建并使用的 IoC 容器中。
@ComponentScan:
ComponentScan 默认会扫描当前 package 下的的所有加
了 @Component、@Repository、@Service、@Controller 的类到 IoC 容器中;
如果是之前的 spring 中使用 redis 需要在 xml 定义 bean, 现在只需要依赖一个 spring-boot-starter-data-redis
的 jar 包,jar 中定义了 RedisConfiguration, 当启动的时候 spring 会自动装载 RedisConfiguration, 那 spring 是如何知道配置类在哪里的呢?RedisConfiguration 类的路径放在了 classpath*META-INF/spring.factories 的文件中,spring 会加载这个文件中配置的 configuration
(1)SpringApplication.run(AppConfig.class,args); 执行流程中有 refreshContext(context); 这句话.
(2)refreshContext(context); 内部会解析我们的配置类上的标签. 实现自动装配功能的注解 @EnableAutoConfiguration
(3)会解析 @EnableAutoConfiguration 这个注解里面的 @Import 引入的配置类.AutoConfigurationImportSelector
(4)AutoConfigurationImportSelector 这个类中有这个方
法.SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
(5)SpringFactoriesLoader.loadFactoryNames 的作用就是读取 jar 包中的 / 项目中的 META-INF/spring.factories 文件.
(6)spring.factories 配置了要自动装配的 Configuration 类
SPI 的全名为 Service Provider Interface,为某个接口寻找服务实现的机制。
当服务的提供者,提供了服务接口的一种实现之后,在 jar 包的 META-INF/services/ 目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该 jar 包 META-INF/services/ 里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。通过这个约定,就不需要把服务放在代码中了,通过模块被装配的时候就可以发现服务类了。
在 springboot 的自动装配过程中,最终会加载 META-INF/spring.factories 文件,而加载的过程是由 SpringFactoriesLoader 加载的。从 CLASSPATH 下的每个 Jar 包中搜寻所有 META-INF/spring.factories 配置文件,然后将解析 properties 文件,找到指定名称的配置后返回。需要注意的是,其实这里不仅仅是会去 ClassPath 路径下查找,会扫描所有路径下的 Jar 包,只不过这个文件只会在 Classpath 下的 jar 包中。
通过 spi 技术可以自定义 starter, 在自定义的配置文件 META-INF/spring.factories 中加入实现类, 依赖这个 starter 的项目就会扫描 jar 包下的配置, 找到实现类进行装载实例化