基本使用

新建Maven项目,在pom.xml中添加依赖

  1. <!-- 1. 继承父项目,里面有所需的各种版本-->
  2. <parent>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <groupId>org.springframework.boot</groupId>
  5. <version>2.3.4.RELEASE</version>
  6. </parent>
  7. <dependencies>
  8. <!-- 2. web项目依赖,里面已经集成了各种SpringMVC相关的依赖-->
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-web</artifactId>
  12. </dependency>
  13. </dependencies>

编写应用入口文件

  1. @SpringBootApplication //标识这个是Springboot的启动类
  2. public class Application {
  3. public static void main(String[] args) {
  4. //可以理解固定写法,启动
  5. SpringApplication.run(Application.class,args);
  6. }
  7. }

具体使用,新建Controller作为测试

  1. @RestController
  2. public class LoginController {
  3. @RequestMapping("/login")
  4. public String login(){
  5. return "Hello SpringBoot";
  6. }
  7. }

直接点击下图运行即可
image.png
访问http://localhost:8080/login
image.png
就是这么简单!

SpringBootApplication注解

SpringBootApplication中包含3个注解

  • @ComponentScan 默认会扫描当前包以及子包中的所有类
  • @EnableAutoConfiguration 这个先作为了解,以后会进行源码分析。可以根据Maven依赖自动构建相关环境
  • @SpringBootConfiguration 这个以后讲

打包可运行的jar

因为我们的项目有main方法,我们可以使用如下插件打包可运行的jar

  1. <build>
  2. <finalName>springBoot_01</finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. </plugin>
  8. </plugins>
  9. </build>

image.png
点击package打包
image.png
在终端执行如下命令

  1. java -jar springBoot_01.jar

在浏览器访问http://localhost:8080/login
image.png
由于上面已经有spring-boot-maven-plugin这个插件,启动springboot应用也可以使用如下方式启动

Snipaste_2021-12-01_10-47-38.png
这个效果和直接点击main方法启动是一样的。

热部署

添加如下插件(Debug模式下,可以监控classpath的变化)

  1. <!-- 热部署 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-devtools</artifactId>
  5. </dependency>

改动代码后,只需重新编译即可。可以自己设置喜爱的快捷键,我的是command + b
image.png

@Bean小细节

以前我们的@Bean注解只能放在@Configuration修饰的类里面

  1. @Configuration
  2. public class Person {
  3. @Bean
  4. public Person Person1(){
  5. return new Person();
  6. }
  7. }

在SpringBoot2.2.1开始,@Bean也可以放在@Component修饰的类中,只要该类被扫描到放到IOC容器中即可

  1. @Component
  2. public class Person {
  3. @Bean
  4. public Person Person1(){
  5. return new Person();
  6. }
  7. }

应用程序配置文件

SpringBoot默认会加载一个叫application的配置文件。文件扩展名可以为.properties或者.yml。推荐使用.yml这样结构更加清晰。
application.yml的配置文件可以放在如下位置(优先级有高到底)

  • 项目根目录下/config/
  • 项目根目录下/config/*/
  • 项目根目录下/
  • classpath:/config/
  • classpath:/

注意:上面项目根目录不是模块Module的根目录
对应如下位置,序号表示优先级
Snipaste_2021-12-01_12-28-15.png

配置文件里面可以配置什么

服务端的配置内容都在如下位置
Snipaste_2021-12-01_13-14-24.png
示例:

  1. server:
  2. port: 8801 #设置端口
  3. servlet:
  4. context-path: /sb #设置contextpath

YAML配置文件使用空格和tab键作为层级缩进,:号后面的内容也要有空格和tab键,字符串可以不加双引号,如果有转义字符可以使用双引号扩住字符串。

属性绑定

application.yml文件里面的内容可以绑定或注入到其他类的属性里面。
示例:application.yml文件里面的内容如下

  1. server:
  2. port: 8801 #设置端口
  3. servlet:
  4. context-path: /sb #设置contextpath
  5. name: lff
  6. age: 18

如果需要把name和age注入到Person类里面,采用@Value()的方式注入

  1. @Component
  2. //@PropertySource("classpath:application.yml") application配置文件里面的内容不需要加这个
  3. public class Person {
  4. @Value("${name}")
  5. String name;
  6. @Value("${age}")
  7. Integer age;
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public Integer getAge() {
  15. return age;
  16. }
  17. public void setAge(Integer age) {
  18. this.age = age;
  19. }
  20. @Override
  21. public String toString() {
  22. return "Person{" +
  23. "name='" + name + '\'' +
  24. ", age=" + age +
  25. '}';
  26. }
  27. }

这种方式注入没有问题,但如果配置文件里面有很多东西,都需要进行注入就比较麻烦了,我们可以采用如下方案。
使用@ConfigurationProperties注解即可
修改配置文件为

  1. server:
  2. port: 8801 #设置端口
  3. servlet:
  4. context-path: /sb #设置contextpath
  5. person: #这个叫前缀
  6. name: lff
  7. age: 18
  1. @Component
  2. @ConfigurationProperties("person") //person为在配置文件配置的前缀
  3. public class Person {
  4. String name;
  5. Integer age;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public Integer getAge() {
  13. return age;
  14. }
  15. public void setAge(Integer age) {
  16. this.age = age;
  17. }
  18. @Override
  19. public String toString() {
  20. return "Person{" +
  21. "name='" + name + '\'' +
  22. ", age=" + age +
  23. '}';
  24. }
  25. }

这样就OK了。

Lombok

上面person如果有很多属性,需要写很多setter、getter方法,能不能自动给我们生成一些常用的方法呢?我们可以添加Lombok依赖

  1. <!-- 只需在编译期间有即可scope设置成provided-->
  2. <dependency>
  3. <groupId>org.projectlombok</groupId>
  4. <artifactId>lombok</artifactId>
  5. <scope>provided</scope>
  6. </dependency>

我们Person类这样写就可以了

  1. @Component
  2. @ConfigurationProperties("person") //person为在配置文件配置的前缀
  3. @Data
  4. public class Person {
  5. String name;
  6. Integer age;
  7. }

@Data会为我们生成如下有用的方法
image.png
查看官方链接https://projectlombok.org/features/Data

默认情况下是敲不出person对象的自动生成的方法。如果想在IDEA中敲出自动生成的方法需要安装相应的插件
image.png

如果想办到在模型文件里面修改属性,对应的配置文件有提示,我们需要加下面依赖

  1. <!-- 当模型文件里面属性修改时,配置文件里面会有提示信息-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-configuration-processor</artifactId>
  5. </dependency>

修改模型对象试一下

  1. @Component
  2. @ConfigurationProperties("person") //person为在配置文件配置的前缀
  3. @Data
  4. public class Person {
  5. String name;
  6. Integer age;
  7. String[] names;
  8. Map<String,String> hobby;
  9. List<Dog> dogs;
  10. @Data
  11. public static class Dog{
  12. String name;
  13. Integer age;
  14. }
  15. }

修改完要编译一下,对应的配置文件

Snipaste_2021-12-01_16-17-28.png

  1. server:
  2. port: 8801 #设置端口
  3. servlet:
  4. context-path: /sb #设置contextpath
  5. person: #这个叫前缀
  6. name: lff
  7. age: 18
  8. # 数组注入有如下几种方式
  9. # names: lff,jack,rose
  10. # names: [lff,jack,rose]
  11. names:
  12. -lff
  13. -jack
  14. -rose
  15. # map有如下两种方式写
  16. # hobby: {hobbytest1: 篮球,hobbytest2: 足球,hobbytest3: 排球}
  17. # 这种写法类似数组
  18. hobby:
  19. - hobbytest1: 篮球
  20. - hobbytest2: 足球
  21. - hobbytest3: 排球
  22. # 注入数组里面放自定义对象
  23. dogs:
  24. - name: dog2
  25. age: 1
  26. - name: dog2
  27. age: 1

Person类上面也可以不加@Component,用到时采用@EnableConfigurationProperties(Person.class)方式加到IOC容器里面
Person类

  1. @ConfigurationProperties("person") //person为在配置文件配置的前缀
  2. @Data
  3. public class Person {
  4. String name;
  5. Integer age;
  6. String[] names;
  7. Map<String,String> hobby;
  8. List<Dog> dogs;
  9. @Data
  10. public static class Dog{
  11. String name;
  12. Integer age;
  13. }
  14. }

用到时使用

  1. @RestController
  2. @EnableConfigurationProperties(Person.class)
  3. public class LoginController {
  4. @Autowired
  5. private Person person;
  6. @RequestMapping("/login")
  7. public String login(){
  8. return "Hello SpringBoot" + person;
  9. }
  10. }

上面Person对象是通过setter方法绑定的,也可以通过构造方法绑定

  1. @ConstructorBinding
  2. @ConfigurationProperties("person") //person为在配置文件配置的前缀
  3. @Data
  4. public class Person {
  5. String name;
  6. Integer age;
  7. String[] names;
  8. Map<String,String> hobby;
  9. List<Dog> dogs;
  10. public Person(String name,Integer age,String[] names,Map<String,String> hobby,List<Dog> dogs){
  11. this.name = name;
  12. this.age = age;
  13. this.names = names;
  14. this.hobby = hobby;
  15. this.dogs = dogs;
  16. }
  17. @Data
  18. public static class Dog{
  19. String name;
  20. Integer age;
  21. }
  22. }

外界使用

  1. @RestController
  2. @EnableConfigurationProperties(Person.class)
  3. public class LoginController {
  4. @Autowired
  5. private Person person;
  6. @RequestMapping("/login")
  7. public String login(){
  8. return "Hello SpringBoot" + person;
  9. }
  10. }

构造方法绑定只能使用@EnableConfigurationProperties注解,不能使用@Component

配置文件的拆分

可以使用—-将配置文件拆分多个文档
image.png
也可以拆分多个配置文件application-* 后面的部分默认就是文档名
Snipaste_2021-12-02_08-46-48.png

关于starter的命名规范

官方链接:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters
官方starter的命名方式为:spring-boot-starter-*
第三方starter命名规范:thirdpartyproject-spring-boot-starter.