Java后端

【Spring Boot】入门

2019-10-20  本文已影响0人  大数据阶梯之路

一、Spring Boot简介

spring boot是一个主要用来简化spring应用开发的框架,核心思想:约定大于配置。
spring boot推荐使用全注解的方式来进行开发。
接触过spring框架开发的,对于学习spring boot就会得心应手了,十分方便。
spring boot --> J2EE一站式解决方案
spring cloud --> 分布式整体解决方案

spring boot优点

二、使用maven创建一个hello world入门程序

环境准备:jdk1.8、maven3、idea
前提:自行百度解决idea整合好jdk1.8和maven3
spring官网其实有给spring boot入门帮助文档的:https://spring.io/guides/gs/spring-boot/

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zhbit.xiaojiang.HelloWorld</groupId>
    <artifactId>HelloWorld</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
/**
 * FileName: HelloWorld
 * Author:   小江
 * Date:     2019/10/19 9:29
 * History:
 */
package com.zhbit.xiaojiang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloWorld {
    //spring应用启动起来
    public static void main(String[] args) {
        SpringApplication.run(HelloWorld.class,args);
    }
}
/**
 * FileName: HelloController
 * Author:   小江
 * Date:     2019/10/19 9:32
 * History:
 */
package com.zhbit.xiaojiang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @ResponseBody
    @RequestMapping("/Hello")
    public String Hello(){
        return "Hello World!";
    }
}
图片.png 启动完成后在浏览器输入localhost:8080/Hello即可访问hello world程序了。

另外,在上面简介中提到spring boot有个优点:简化服务器部署条件,意思是不需要服务器有Tomcat环境,spring boot应用打包成jar包即可运行,因为打包的时候把内嵌Tomcat也打包进去了。

图片.png 于是我们把idea里的hello world停掉,经过上面3步骤打包出jar包,然后直接切换到所在目录运行java -jar jar包名即可运行spring boot程序了,照样浏览器输入localhost:8080/Hello,仍可访问。 图片.png 若把cmd命令行窗口关掉就意味着tomcat也关掉了。

三、spring boot启动器

spring-boot-starter就是启动器,有各种场景,按需导入。比如当我们要开发web项目的时候就得在pom.xml文件里配置spring-boot-starter-web模块,这模块里面包含了使一个web程序正常运行的所有组件。

图片.png

四、YAML配置文件

spring boot时常采用以下2种全局配置文件

//这种是application.properties文件
server.port=8081   

//这种是application.yml文件,区别于XML配置文件,没有太多的开闭标签,是以数据为中心的配置文件
server:
 port: 8081
YAML的语法

写yaml配置文件最需要注意的是键值对(k: v)之间的空格千万不能忘记加,还有大小写敏感。

关于yaml配置文件值的写法,有3种类型

1、字面量,即数值、字符串、布尔值

注意:字符串默认是不加单引号或者双引号的,如果加上了的话,单引号和双引号出来的效果又会不一样,双引号对特殊字符是会转义的,而单引号不会转义。
举例:
age: "15 \n 22"   则输出:15 换行 22
age: '15 \n 22'   则输出:15 \n 22

2、对象、Map,即属性和值,注意缩进和:空格

friends:    //对象
  name: xiaojiang    //属性和值
  age: 22

friends: {name: xiaojiang,age: 22}   //与上面同义,是行内写法

3、数组,即List、Set

animals:    //数组
  - pig     //- 值  表示数组内的一个元素
  - cat
  - dog

animals: [pig,cat,dog]    //与上面同义,是行内写法

五、初试yaml和properties配置文件

application.yml

server:
  port: 8081

person:
  name: xiaojiang
  age: 22
  boss: false
  birth: 2019/10/19
  maps: {k1: v1,k2: v2}
  lists:
    - worker
    - student
  dog:
    name: 小狗
    age: 2

application.properties

server.port=8081

person.name=小江
person.age=22
person.boss=false
person.birth=2019/10/19
person.maps.k1=v1
person.maps.k2=v2
person.lists=worker,student
person.dog.name=小狗
person.dog.age=2

上面的配置文件是等同的(二者选一)配置属性的值,下面的是bean的属性,通过@ConfigurationProperties注解把配置文件与bean属性绑定起来,记得要使用@Component注解,把bean组件加到spring容器中,才能使用这个@ConfigurationProperties注解的功能。

/**
 * FileName: Person
 * Author:   小江
 * Date:     2019/10/19 21:51
 * History:
 */
package com.zhbit.xiaojiang.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 *@Author 小江  [com.zhbit]
 *@Date 2019/10/19 18:49
 *Description:将配置文件中配置的属性的值都映射到这个bean组件中
 * @ConfigurationProperties注解:告诉springboot这个bean组件中所有属性和配置文件中相关的配置进行绑定
 * prefix="Person"表示配置文件中的person的所有值与下面所有属性一一映射
 * @Component注解:把bean加入Spring容器中
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private int age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;

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

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Boolean getBoss() {
        return boss;
    }
    public void setBoss(Boolean boss) {
        this.boss = boss;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public Map<String, Object> getMaps() {
        return maps;
    }
    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }
    public List<Object> getLists() {
        return lists;
    }
    public void setLists(List<Object> lists) {
        this.lists = lists;
    }
}
注解场景区别.png

当然,这些配置都是在全局配置文件里的,但是如果都把一些与spring框架无关的业务配置在全局配置文件中的话,全局配置文件就太冗杂了,于是可以拆分出来,业务属性的注入可以使用@Value在代码中注入,也可以单独抽出来一个非全局配置文件,然后通过@PropertySource注解加载指定的配置文件,如下:

@PropertySource(value = {"classpath:person.properties"})

六、切换多场景的配置文件

我们的项目在不同的场景可能会有不同的配置,比如在开发环境下,在生产环境下,在测试环境下,都会有不同的配置信息(比如端口号)要改,我们可以写不同份.properties配置文件,然后想用哪一份就激活那一份即可。
使用.yml配置文件的话就更方便些,不用写多份配置文件,因为.yml配置文件支持多文档块形式,类似于如下这样:

server: 
  port: 8081
spring: 
  profiles: dev
---   //这就是用来划分文档块的分隔符
server: 
  port: 8082
spring: 
  profiles: test
---   //这就是用来划分文档块的分隔符
server:
  port: 8083
spring: 
  profiles: prod
激活指定哪份配置,有3种方式

1、默认是选择第一块配置信息,比如要激活指定切换到生产环境的配置文件,就如下配置

server: 
  port: 8081
spring: 
  profiles: dev
    active: prod   //激活上面生产环境的配置块
2、使用命令行参数的方式激活配置块 图片.png 3、使用虚拟机参数的方式激活配置块 图片.png

七、配置文件优先级

关于springboot配置文件的加载顺序,主要体现在项目的运维这一领域,比如当我们打包好了项目的jar包,但有时需要修改下端口号等配置但又不想改动项目代码重新打包,我们可以在外部写一个配置文件,然后和jar包放在同路径下就可以加载到外部的配置信息了。
优先级:
项目内的话,先是加载项目根目录下的config目录下的配置文件-->再是加载项目根目录下的配置文件-->然后是项目根目录下的resource目录下的config目录下的配置文件-->最后才是项目根目录下的resource目录下的配置文件。
项目外的话,优先级更高,有通过把配置文件放在和jar包同路径下的,有通过命令行参数的方式启动jar包带上配置参数的,有通过代码里使用@PropertySource注解加载指定的外部配置文件的。
总结:不管是项目内还是项目外,所有配置文件都会被加载到,配置文件加载都遵循相同配置优先级高的覆盖优先级低的,不同配置则直接互补。

附:Spring Boot官网文档

上一篇 下一篇

猜你喜欢

热点阅读