zoukankan      html  css  js  c++  java
  • 峰哥说技术:04Spring Boot基本配置

    Spring Boot深度课程系列

    峰哥说技术—2020庚子年重磅推出、战胜病毒、我们在行动

    04 Spring Boot基本配置

    1)容器的相关配置

    Spring Boot中可以内置Tomcat、Jetty、undertow、Netty等容器,当开发者在pom.xml中spring-boot-starter-web依赖后,会默认配置Tomcat容器。如果需要对Tomcat进行进一步的配置,可以在application.properties中进行如下的配置。

    #配置端口号
    server.port=9090
    #配置上下文路径
    server.servlet.context-path=/web01

    在上面的配置中有解释说明,更多的配置请参考spring boot的官网。这里给大家列出详细的地址。

    其他容器的配置,这里举例说明Jetty容器的配置。它的主要步骤分为两步。分别如下

    A) spring-boot-starter-web中排除掉tomcat

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
              <exclusions>
                  <exclusion>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-tomcat</artifactId>
                  </exclusion>
              </exclusions>
    </dependency>

    B)在pom.xml中添加spring-boot-starter-jetty依赖即可。

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

    启动服务后,在控制台发现如下信息,说明配置成功。

       

    切换容器,可以清楚的看到在application.properties中的配置也不需要修改,它也会在新的容器中起作用。

    2)Spring的属性注入

    spring boot中采用了大量的自动配置,但是很多时候不可避免要使用用户的自定义配置,我们一般可以在application.properties或者application.yml文件中进行配置即可。至于.properties和.yml的选择我们在后面进行介绍。application.properties可以出现在4个位置。

    A)项目根目录的config文件夹

    B)项目的根目录

    C)classpath的config文件夹

    D)classpath下面,这个是默认值。

    这里不给大家演示,有兴趣的同学可以自行尝试。它的覆盖顺序就是上面的所说的顺序。如果是.yml文件,跟这个顺序是一样的。

    由于 Spring Boot 源自 Spring ,所以 Spring 中存在的属性注入,在 Spring Boot 中一样也存在。由于 Spring Boot 中,默认会自动加载 application.properties 文件,所以简单的属性注入可以直接在这个配置文件中写。

    案例:演示普通属性的注入,在工程中创建包entity,并编写Book类,添加相关属性,同时修改HelloController。

    A)编写Book类

    package com.java.chapter01.entity;

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Component;

    @Component
    public class Book {
        @Value("${book.id}")
        private Integer id;
        @Value("${book.name}")
        private String name;
        @Value("${book.author}")
        private String author;

    //省略getter和setter
    }

    B)修改HelloController

    package com.java.chapter01.controller;

    import com.java.chapter01.entity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class HelloController {
        @Autowired
        private Book book;   
        @GetMapping("/book")
        public Book book(){
            return book;
        }
    }

    注意:Book类必须要能被Spring容器所管理,所以添加注解@Component,然后在HelloController中用@Autowired进行注入。

    C)修改application.properties文件,进行属性值的初始化操作.

    #配置端口号
    server.port=9090
    #配置上下文路径
    server.servlet.context-path=/web01

    #普通属性的注入
    book.id=1
    book.name=史记
    book.author=司马迁

    需要注意的是,如果属性值是字符串不需要写分号。汉字会出现中文乱码问题,解决方法非常简单。如下图所示,操作即可。

       

    最后进行测试,在浏览器输入http://localhost:9090/web01/book,最终效果如下:

       

    一般来说,我们在 application.properties 文件中主要存放系统配置,这种自定义配置不建议放在该文件中,可以自定义 properties 文件来存在自定义配置。

    案例:将上面的案例编写自定义属性文件book.properties文件,然后进行属性的注入。

    A)编写自定义属性文件book.properties,放在resources文件夹下面。

    #普通属性的注入
    book.id=1
    book.name=资治通鉴
    book.author=司马光

    B)修改Book类,添加注解@PropertySource("classpath:book.properties")

    @Component
    @PropertySource("classpath:book.properties")
    public class Book {
        @Value("${book.id}")
        private Integer id;
        @Value("${book.name}")
        private String name;
        @Value("${book.author}")
        private String author;

    //getter和setter省略
    }

     项目截图如下所示

       

    测试结果和上面的案例相同,这里省略。

    3)类型安全的属性注入

    Spring Boot 引入了类型安全的属性注入,如果采用 Spring 中的配置方式,当配置的属性非常多的时候,工作量就很大了,而且容易出错。使用类型安全的属性注入,可以有效的解决这个问题。

    案例:采用属性安全的方式进行注入,使用注解@ConfigurationProperties(prefix="book"),可以省略@Value在各个属性字段的注入。

    @Component
    @PropertySource("classpath:book.properties")
    @ConfigurationProperties(prefix="book")
    public class Book {
        //@Value("${book.id}")
        private Integer id;
        //@Value("${book.name}")
        private String name;
        //@Value("${book.author}")
        private String author;

        //getter和setter省略

    }

       

    4)yaml配置

    yaml是JSON的超集,简洁而强大,是一种专门用来书写配置文件的语言。它可以代替application.properties。在创建一个Spring boot项目时,引入的spring-boot-starter-web依赖间接的引入了snakeyaml依赖,snakeyaml会实现对YAML配置的支持。它使用非常简单,可以利用缩进来表示层级关系,并且大小写敏感。我们只要在resources文件夹下面创建application.yml文件即可。

    案例:使用.yml来实现容器的上下文和端口的配置。

    实现步骤:

    A)删除application.properties属性配置文件。

    B)resources文件夹下面创建application.yml。在文件中编写如下配置即可。

    server:
      port: 8080
      servlet:
        context-path: /chapter01

       

    这里必须说明的是必须有缩进以及每个冒号后面有空格,否则配置会报错。

    C)测试,在浏览器中输入:http://localhost:8080/chapter01/book.结果如下。

       

    很显然配置文件中配置的端口号和上下文起作用了。

    yaml中可以进行复杂属性的配置,比如数组、集合、Bean,掌握这些配置,基本上就够用了。

    案例:通过yml进行数组、集合和Bean的配置。

    A)编写User类。

    @Component
    @ConfigurationProperties(prefix = "user")
    public class User {
        private Integer userId;
        private String userName;
        private Book book;
        private String[] address;
        private List<Book> bookList;

    //getter和setter省略...
    }

       

    B)编写HelloController

    @RestController
    public class HelloController {
        @Autowired
        private User user;
        @GetMapping("/user")
        public User user(){
            return user;
        }
    }

       

    C)编写application.yml文件

    server:
      port: 8080
      servlet:
        context-path: /chapter01
    user:
      userId: 20
      userName: 李白
      #配置对象
      book:
        id: 10
        name: 资治通鉴
        author: 司马光
      #配置数组
      #address:
      #  - 武汉
      #  - 北京
      #  - 广州2
      address: 济南,山东,河北
      #配置集合List
      bookList:
          - id: 30
            name: 红楼梦
            author: 曹雪芹
          - id: 40
            name: 西游记
            author: 吴承恩
          - id: 50
            name: 三国演义
            author: 罗贯中

       

    D)测试结果

    从结果可以看出,对于数组我们用短横线或者直接写出逗号分隔就可以,对于List集合,用短横线。这些东西非常简单,大家稍做练习就可以掌握。

       

       

    5)Profile相关知识

    开发者开发项目之前,一般需要频繁的在开发环境、测试环境、生产环境直接频繁的进行切换。这个时候大量的配置需要频繁的进行修改,比如数据库的配置、redis的配置、mogodb的配置等。频繁的修改带来了巨大的工作量,Spring提供了@Profile注解,在Spring boot对该功能进行了进一步的简化操作。在Spring boot中约定不同的环境的命名规则为:application-{profile}.properties,这个占位符{profile}表示当前环境的名称。那么开发环境就是application-dev.properties,测试环境就是application-test.properties,生产环境就是application-prod.properties.

    这里必须说明的是,我们如何切换这些环境呢?很简单在application.properties中加上spring.profiles.active=环境名即可。

    案例:配置开发环境和生产环境,并通过profile进行激活。为了简单演示效果,我们只设置端口号,开发环境8080,生产环境9090,并进行测试。

    步骤如下:

    A)resources下面创建application-pro.properties,并编写如下的配置。

    server.port=9090

    B)resources下面创建application-dev.properties,并编写如下的配置。

    server.port=8080

    C)resources下面创建application.properties,并编写如下的配置。

    #spring.profiles.active=dev
    spring.profiles.active=prod

       

    测试,在浏览器输入:http://localhost:9090/hello,可以看到结果。激活dev的操作类似。这里就不在进行说明,大家可以进行测试。

    那么我们可以.yml方式进行吗?答案是肯定的。它支持多文档块方式,大家可以参考如下方式进行测试。

    spring:
      profiles:
        active: dev
    ---
    server:
      port: 8083
    spring:
      profiles: dev
    ---
    server:
      port: 8084
    spring:
      profiles: prod

       

    这里需要注意的是文档块直接用三个短横线隔开即可。配置书写的时候需要注意缩进。

      

    峰哥说技术:04-Spring Boot基本配置

  • 相关阅读:
    JAVA框架 Spring 事务
    JAVA框架 Spring 调用jdbcsuport简化开发
    JAVA框架 Spring JDBC模板
    JAVA框架 Spring AOP注解
    JAVA框架 Spring AOP--切入点表达式和通知类型
    JAVA框架 Spring AOP底层原理
    JAVA框架 Spring junit整合单元测试
    JAVA框架 Spring 注解注入
    JAVA框架 Spring 引入多个配置文件
    django序列化
  • 原文地址:https://www.cnblogs.com/027kgc/p/12342597.html
Copyright © 2011-2022 走看看