Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
在了解SpringBoot之前,先思考一个问题:传统Spring框架有什么缺点?
在传统的Spring项目中有以下几点缺点:
面对Spring框架使用中的缺点无法满足企业的需求,企业现在更注重技术的开箱即用,更注重轻量级的运维,由此SpringBoot诞生.
SpringBoot是一个服务于Spring框架的框架,能够简化配置文件,快速构建web项目,内置tomcat,无需打包部署,直接运行.
SpringBoot构建基于Spring框架基础之上,基于快速构建理念,提供了自动配置功能,可实现开箱即用的特性,可以简化整个项目的配置.其核心主要包括如下几个方面:
1.起步依赖( Stater Dependency)
2.自动配置(Auto Configuration)
3.健康检查(Actator)
起步依赖的功能是:我们只要在构建文件中指定我们所需要的功能,构建程序就会引入相应的依赖包.它就像是一个Maven项目对象模型,其内容定义了对其他库的传递依赖,这些东西加在一起就可以支持我们所需要的某项功能.
起步依赖的版本由SpringBoot的版本来决定的,而起步依赖会决定它们所引入第三方依赖的版本,确保引入的全部依赖都能够相互兼容.
实例:
在传统的Spring项目中,我们平时需要搭建一个Web项目时需要导入一下几个依赖:
Spring-web依赖和Spring-mvc依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
在SpringBoot项目中,搭建web项目只需要添加一个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这个起步依赖集成了常用的web依赖,SpringBoot的起步依赖简单说就是对常用的依赖进行再一次的封装
如图中所示,web起步依赖中集成了各种搭建web环境常用的依赖,在SpringBoot项目中简化了pom.xml文件的配置,更重要的是将依赖交给SpringBoot,我们无需关注不同依赖的不同版本的冲突问题,添加即用.
使用起步依赖时,我们需要在pom.xml中配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
让pom.xml文件继承SpringBoot的pom.xml文件,SpringBoot中的pom.xml文件继承了常用的框架依赖以及相应的版本号.
起步以来的优点:
在创建SpringBoot项目时,会自动创建一个启动类XXXApplication.java
package cn.myli;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
其中最为重要的是@SpringBootApplication这个注解,SpringBoot的自动配置都是由这个注解引入的.
点进这个注解后我们会发现它是一个复合注解:
@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 {
其中重要的有这三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@SpringBootConfiguration注解继承于Configuration注解,功能也一样,标注当前类是配置类,并会将类中用注解@Bean标记的方法的实例放入Spring容器中,并且实例名为方法名.
@ComponentScan注解作用是扫描当前包及子包中用注解@Component@Controller@Service@ Repository标记的类放入Spring容器中进行管理.
@EnableAutoConfiguration注解的作用:开启自动配置
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
这个注解也是一个复合注解其中 @Import 注解引入了类 AutoConfigurationImportSelector 此类中的方法getCandidateConfigurations
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
会将jar包spring-boot-test-autoconfigure-2.2.2.RELEASE.jar下的 /META-INF/spring.factories文件
点击其中一个文件部分内容为:
# AutoConfigureCache auto-configuration imports
org.springframework.boot.test.autoconfigure.core.AutoConfigureCache=\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
Spring,factories文件内容为一组一组的key=value形式,其中key为EnableAutoConfigrution类的全类名,value为一个个的类名列表,类名以逗号分隔.
在启动SpringBoot项目时@SpringBootApplication注解会开启自动配置,SpringApplication.run()内部会执行selectImports()方法,找到所有的自动配置类的全限名对应的class,将所有的配置文件加入到Spring容器中.
总结:
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
引用