Spring Boot
1. SpringBoot的特点
为基于Spring的开发提供更快的入门体验
开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等
SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式
3. SpringBoot的核心功能
起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。
4. 入门程序
1. 添加SpringBoot的起步依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<!--SpringBoot要集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3. 编写SpringBoot引导类
//@SpringBootApplication:标注SpringBoot的启动类,该注解具备多种功能
//SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot
启动类的字节码对象
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class);
}
}
5. 编写Controller
@Controller
public class QuickStartController {
@RequestMapping("/quick")
@ResponseBody
public String quick(){
return "springboot 访问成功!";
}
}
7. SpringBoot工程热部署
配置热部署可以使我们不用更新代码后,不需要重启tomcat
<!--热部署配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
出现这种情况,并不是热部署配置问题,其根本原因是因为Intellij IEDA默认情况下不会自动编译,需要对IDEA进行自动编译的设置,如下:
然后 Shift+Ctrl+Alt+/,选择Registry,也可以.CTRL + SHIFT + A 打开窗口,输入:Registry 搜索
6. SpringBoot原理分析
- 起步依赖原理分析
<!--在我们的maven里继承了我的父类
在spring-boot-starter-parent,定义了加载的配置文件,和许多插件
在spring-boot-dependencies父类里定义了许多版本号,和坐标,这是为什么我们不用担心版本冲突,
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
- 分析spring-boot-starter-web
<!--
对spring web所用到的一个jar封装
-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 自动配置原理解析
按住Ctrl点击查看启动类MySpringBootApplication上的注解@SpringBootApplication
//Target Retention Documented Inherited : Java的元注解
//@SpringBootConfiguration : 里面封装了@Configuration
//@EnableAutoConfiguration: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 {
/**
* Exclude specific auto-configuration classes such that they will never be
applied.
* @return the classes to exclude
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
... ... ...
}
按住Ctrl点击查看注解@EnableAutoConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
/*@Import(AutoConfigurationImportSelector.class) 导入了AutoConfigurationImportSelector类,
AutoConfigurationImportSelector里面SpringFactoriesLoader.loadFactoryNames 方法加载了META-INF/spring.factories文件中指定
*/
类对应的类名称列表
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
... ... ...
}
7. SpringBoot配置文件类型
1)配置文件信息
<!--
在spring-boot-starter-parent里我们可以找到加载配文件的信息
在有多个配置文件时,配置相同的属性后面的配置文件会覆盖之前的
-->
<resources>
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/application*.yml</exclude>
<exclude>**/application*.yaml</exclude>
<exclude>**/application*.properties</exclude>
</excludes>
</resource>
</resources>
2)application.yml配置文件
#key: value
#注意:value之前有一个空格
name: haohao
#配置对象数据
#语法:yml可以靠分层来确定关系,key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别
#key:
#key1: value1
#key2: value2
#或者:
#key: {key1: value1,key2: value2}
person:
name: haohao
age: 31
addr: beijing
#或者
person: {name: haohao,age: 31,addr: beijing}
#配置数组(List、Set)数据
#语法:
#key:
#- value1
#- value2
#或者:
#key: [value1,value2]
#注意:value1与之间的 - 之间存在一个空格
city:
- beijing
- tianjin
- shanghai
- chongqing
#或者
city: [beijing,tianjin,shanghai,chongqing]
#集合中的元素是对象形式
student:
- name: zhangsan
age: 18
score: 100
- name: lisi
age: 28
score: 88
- name: wangwu
age: 38
score: 90
2)application.yml,application.poperties配置端口
application.properties文件
//端口
server.port=8888
//后缀
server.servlet.context-path=demo
application.yml文件
server:
port: 8888
servlet:
context-path: /demo
2)通过注解,映射到属性上
application.yml配置如下:
person:
name: zhangsan
age: 18
实体Bean代码如下:
@Controller
public class QuickStartController {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private Integer age;
@RequestMapping("/quick")
@ResponseBody
public String quick(){
return "springboot 访问成功! name="+name+",age="+age;
}
}
也可以写成
@Controller
//配置映射
@ConfigurationProperties(prefix = "person")
public class QuickStartController {
//注意:属性名要与yml中键一样
private String name;
private Integer age;
@RequestMapping("/quick")
@ResponseBody
public String quick(){
return "springboot 访问成功! name="+name+",age="+age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
}