一、前言

我在系统学习了SSM框架后,准备学习SpringBoot的相关内容,期间还抽出了些时间去学习Git,SpringBoot将极大地简化SSM操作的流程,包括导入依赖的繁琐,以及xml配置文件(SpringBoot使用yml/yaml配置文件,可读性高,配置更简化),同时采用全注解开发(bean不需要在xml中依赖注入,直接自动装配),节省步骤的同时,用yml配置解耦,依然可以达到同样的效果。并且内置tomcat,采用引导类一键启动,不需要再安装插件用maven启动了。配置环境也可以随时切换,通过在yml中使用profile配置,可以随时切换到不同环境的配置中(例如开发、测试、生产环境),并且完全解耦,甚至可以在命令行中选择环境(相较于spring中需要指定Application.xml更加松耦合)。

二、快速入门

1.三种创建方式

直接通过idea创建SpringBoot模块,本质是通过服务器URL来进行创建的,这里我们是通过spring官网进行创建的(所以当然需要联网了)

在官网中也可以进行创建,创建后会给你一个压缩包,解压后就可以正常使用了。

同样,也可以使用别的网址来创建Spring Boot项目,比如使用阿里云,URL如下:https://start.aliyun.com/

这个创建速度将比官网还要快,但是据我尝试,发现普遍版本比较落后,但是影响也不是很大,同时在创建速度上,官网其实也不算慢,所以这里我还是推荐在idea中使用官网网址来创建。

接下来勾选Spring web,这是一个web开发的依赖,是一个复合的依赖,也就是说这个依赖中含有很多包,这些包的版本都是兼容的,我们只需要指定继承的父工程的版本就能直接导入一个适配的复合依赖包(意味着依赖包不需要指定版本了,并且只需要导入几个常用的符合包就行了),相较于spring一个一个导会方便很多。

    <!--springboot工程需要继承的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
    </parent>

    <dependencies>
        <!--web开发的启动依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

这里我们再创建一个引导类:

@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class,args);
    }
}

在前言中已经提及了,SpringBoot是可以允许一键启动的,这个启动的入口就在引导类,只要运行引导类,整个项目就可以启动(省去了用maven启动tomcat的步骤)

运行后就能看到SpringBoot的标志(请忽略我这里的警告)

2.hello Spring Boot

刚刚只是Spring Boot项目创建的准备部分,这里我们将实现在网页上打印hello Spring Boot

@RestController//这是复合注解,相当于@Controller和@ResponseBody
public class HelloController {
  
    @RequestMapping("/hello")
    public String hello(){
        return "hello SpringBoot 2!";
    }
}

引导类不变,我们这里再写出一个Controller(注意这个注解是复合注解

这里可以看到端口依旧是8080:

效果如下:

三、通过yml配置获取数据

1.yml格式

在以前,我们用properties改变端口的格式如下:

server.port=8081

而yml的格式如下:

server:
  port: 8083

下面是yml文件的几个基本格式(map、对象、数组、常量、引用参数)

#必须加空格!!!

#server:
#  port: 8083


#map格式(对象)
person1:
  name: yds
  age: 20
  address:
    - beijing
    - shanghai

#行内写法
person2: {name: yds,age: 20}



#数组格式
address1:
  - beijing
  - shanghai
#行内写法
address2: [beijing,shanghai]



#纯量:(常量)
msg1: 'hello \n world' #单引号忽略转义字符
msg2: "hello \n world" #双引号识别转义字符


#参数引用
name: yds2

person3:
  name: ${name}

2.获取数据

这里我们写一个JavaBean:Person来模拟一个封装类:

@Component
@ConfigurationProperties(prefix = "person1")//指定前缀,表示自动装配的对象
public class Person {

    private String name;
    private int age;
    private String[] address;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String[] getAddress() {
        return address;
    }

    public void setAddress(String[] address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

注意:我们这里已经使用@ConfigurationProperties注解向类中注入了数据(注入的是yml配置中的person1这个对象),并且将Person类用@Component注入到bean中了。

重写Controller,尝试将yml配置中的数据注入到Controller中,并打印:

@RestController//这是复合注解,相当于@Controller和@ResponseBody
public class HelloController {
    //获取map
    @Value("${name}")
    private String name;

    //获取对象
    @Value("${person1.name}")
    private String name2;

    @Value("${person1.age}")
    private String age;

    //获取数组
    @Value("${address1[0]}")
    private String address1;

    @Value("${address1[1]}")
    private String address2;

    @RequestMapping("/hello")
    public String hello(){
        return "hello SpringBoot !";
    }

    //获取纯量
    @Value("${msg1}")
    private String msg1;

    @Value("${msg2}")
    private String msg2;

    //使用environment读取内容
    @Autowired
    private Environment env;

    @Autowired
    private Person person;

    //获取数据
    @RequestMapping("/hello2")
    public String hello2(){
        System.out.println(name);

        System.out.println(name2);
        System.out.println(age);

        System.out.println(address1);
        System.out.println(address2);

        System.out.println(msg1);
        System.out.println(msg2);
        System.out.println("-------------------------------------------");

        //使用environment获取内容
        System.out.println(env.getProperty("person3.name"));
        System.out.println(env.getProperty("address1[0]"));
        System.out.println("-------------------------------------------");

        System.out.println(person);
        String[] address = person.getAddress();
        for (String s : address) {
            System.out.println(s);
        }


        return "hello2";
    }

}

效果如下:

四、profile

profile其实不是很好翻译,网上的翻译软件给的是轮廓的意思,也还是不够准确,我觉得叫做配置环境要好一些。

前言中已经提到profile的作用:通过在yml中使用profile配置,可以随时切换到不同环境的配置中(例如开发、测试、生产环境),并且完全解耦,甚至可以在命令行中选择环境(相较于spring中需要指定Application.xml更加松耦合)

1.用properties和yml配置环境

直接看看示例吧:

首先编写三个properties配置文件,模拟三种配置环境:

里面都只写一行代码,不同的配置环境我们使用不同的端口:

比如开发:

server.port=8081

测试我们用8082,生产用8083

现在创建一个新的properties文件,在这里面,我们将配置环境设置为生产环境,看看端口号是否改变为8083

确实是改变了

但是这并不是最方便的办法

其实我们可以直接使用一个yml配置来达到一样的效果:

(注意:亲测这里老版和新版格式不太一样)

老版springboot:

# "---"表示分隔符,表示分隔不同环境(开发、测试、生产)的配置
#注意:以下是老版的profile配置
---
server:
  port: 8081

spring:
  profiles: dev
---
server:
  port: 8082

spring:
  profiles: test
---

server:
  port: 8083

spring:
  profile: pro
---
spring:
  profiles:
    active: pro

新版springboot:

#注意:新版SpringBoot的profile配置应该如下
---
server:
  port: 8081
spring:
    config:
      activate:
        on - profile: dev
---
server:
  port: 8082
spring:
  config:
    activate:
      on - profile: test
---
server:
  port: 8083
spring:
  config:
    activate:
      on - profile: pro
---
spring:
  profiles:
    active: pro

效果如下:

2.用命令行配置环境

如果我们在idea中配置运行程序,就可以指定程序参数或者虚拟机选项:

我们这里修改虚拟机选项,直接设置配置环境为test:

-Dspring.profiles.active=test

再使用命令行参数,修改为生产环境:

--spring.profiles.active=pro

五、配置文件加载顺序

内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
 
1. file:./config/:当前项目下的/config目录下
2. file:./  :当前项目的根目录
3. classpath:/config/:classpath的/config目录
4. classpath:/:classpath的根目录
加载顺序为上文的排列顺序,高优先级配置的属性会生效

外部配置加载顺序可自行在官网查询。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐