SpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
SpringBoot所具备的特征:
- 可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
- 内嵌Tomcat或Jetty等Servlet容器;
- 提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
- 尽可能自动配置Spring容器;
- 提供准备好的特性,如指标、健康检查和外部化配置;
- 绝对没有代码生成,不需要XML配置。
Spring Boot框架的优点
1.基于Spring4
因为Spring Boot是伴随着Spring4.0而生的,boot是引导的意思,也就是它的作用其实就是在于帮助开发者快速的搭建Spring框架,因此Spring Boot继承了Spring优秀的基因,在Spring中开发更为方便快捷。
2.对编码的简化
当我们想要创建一个项目时,使用 Spring的朋友都知道,在使用Spring 的时候,需要在pom文件中添加多个依赖,而Spring Boot则会帮助开发着快速启动一个容器,在Spring Boot中,我们只需要在pom文件中添加依赖即可。当点击进入依赖后可以看到,Spring Boot里已经包含了多个依赖,包括之前在Spring工程中需要导入的依赖。所以,我们可以看出Spring Boot在使用时可以大大简化我们的编码,我们不需要一个个导入依赖,直接一个依赖即可。
3.对配置的简化(纯java配置)
Spring 虽然使JavaEE轻量级框架,但是其中各种XML、Annotation配置会让人眼花缭乱,而且配置多的话,如果出错了也很难找出原因。Spring Boot更多的是采用 Java Config的方式,对Spring进行配置。这样可以使配置更加的简单,而且在部署配置方面,原来Spring有多个xml和properties配置,在Spring Boot中只需要个application.yml即可。
4.对部署的简化(内嵌服务器)
在使用Spring时,项目部署时需要我们在服务器上部署tomcat,然后把项目打成war包扔到tomcat里,在使用Spring Boot后,我们不需要在服务器上去部署tomcat,因为Spring Boot内嵌了tomcat,我们只需要将项目打成jar包,使用java-jar xxx.jar一键式启动项目。另外,也降低对运行环境的基本要求,环境变量中有JDK即可。
5.对监控的简化(生产级服务监控方案)
我们可以引入spring-boot-start-actuator依赖,直接使用rest方式来获取进程的运行期性能参数,从而达到监控的目的,比较方便。但是Spring Boot只是个微框架,没有提供相应的服务发现与注册的配套功能,没有外围监控集成方案,没有外围安全管理方案,所以在微服务架构中,还需要Spring Cloud来配合一起使用。
Spring Boot的主要执行流程
Spring Boot的主要执行流程图

- 创建controller
package edu.niit.spring.helloworld.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello spring boot !!!";
}
}
- 创建spring boot启动类
package edu.niit.spring.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
现在就可以启动访问项目了。
分析:
- springboot的启动类必须满足以下两个条件:该类必须在项目的根目录或者父包中;该类必须有@SpringBootApplication注释,这个注释说明了该类为springboot程序的启动类,是整个程序的入口。
- SpringBoot程序启动时,启动类的main方法是程序的入口,执行SpringApplication.run(HelloWorldApplication.class, args);该方法返回一个ConfigurableApplicationContext对象,使用注解的时候返回的具体类型是AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext,当支持web的时候是第二个。
- 当程序开始启动时,在启动类中调用SpringApplication的静态run方法,此时会执行以下操作:1、首先新建一个SpringApplication对象;2、然后执行对象的run()方法;3、对配置的启动类所在包及子包中的类进行扫描,对于有spring相关注解的类,通过反射为其创建代理对象,并交由spring容器管理。
Spring Boot自动配置的原理
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
- HelloWorldApplication作为入口类,入口类中有一个main方法,这个方法其实就是一个标准的Java应用的入口方法,一般在main方法中使用SpringApplication.run()来启动整个应用。值得注意的是,这个入口类要使用@SpringBootApplication注解声明,它是SpringBoot的核心注解。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
- 这个注解里面,最主要的就是@EnableAutoConfiguration,它可以开启自动配置,我们进去看@EnableAutoConfiguration的源码。
- 可以看到,在@EnableAutoConfiguration注解内使用到了@import注解来完成导入配置的功能,而EnableAutoConfigurationImportSelector内部则是使用了SpringFactoriesLoader.loadFactoryNames方法进行扫描具有META-INF/spring.factories文件的jar包。
- 任何一个springboot应用,都会引入spring-boot-autoconfigure,而spring.factories文件就在该包下面。spring.factories文件是Key=Value形式,多个Value时使用,隔开,该文件中定义了关于初始化,监听器等信息,而真正使自动配置生效的key是org.springframework.boot.autoconfigure.EnableAutoConfiguration。
- 上面的EnableAutoConfiguration配置了多个类,这些都是Spring Boot中的自动配置相关类;在启动过程中会解析对应类配置信息。每个Configuation类都定义了相关bean的实例化配置。都说明了哪些bean可以被自动配置,什么条件下可以自动配置,并把这些bean实例化出来。
自动化配置代码的注解配置
- @Configuration:这个配置就不用多做解释了,我们一直在使用
- @EnableConfigurationProperties:这是一个开启使用配置参数的注解,value值就是我们配置实体参数映射的ClassType,将配置实体作为配置来源。
SpringBoot内置条件注解
- @ConditionalOnBean:当SpringIoc容器内存在指定Bean的条件
- @ConditionalOnClass:当SpringIoc容器内存在指定Class的条件
- @ConditionalOnExpression:基于SpEL表达式作为判断条件
- @ConditionalOnJava:基于JVM版本作为判断条件
- @ConditionalOnJndi:在JNDI存在时查找指定的位置
- @ConditionalOnMissingBean:当SpringIoc容器内不存在指定Bean的条件
- @ConditionalOnMissingClass:当SpringIoc容器内不存在指定Class的条件
- @ConditionalOnNotWebApplication:当前项目不是Web项目的条件
- @ConditionalOnProperty:指定的属性是否有指定的值
- @ConditionalOnResource:类路径是否有指定的值
- @ConditionalOnSingleCandidate:当指定Bean在SpringIoc容器内只有一个,或者虽然有多个但是指定首选的Bean
- @ConditionalOnWebApplication:当前项目是Web项目的条件