SpringBoot个性化配置

/ SpringBoot / 没有评论 / 156浏览

在上一篇中我们简单的介绍了SpringBoot项目的创建及其启动方式。在这一篇中我们主要介绍一下SpringBoot项目的个性化配置。因为通过上一篇中知识我们知道SpringBoot项目的默认端口为8080,那如果我要修改这个默认端口,应该怎么改呢?又比如SpringBoot项目在启动时,默认是没有项目名字的,那如果我们想要添加自己喜欢的项目名字又该怎么办呢?这些都在这一篇的内容中。好了,下面我们详细介绍一下怎么修改SpringBoot项目中的默认配置。


修改默认端口

  在上一篇的SpringBoot项目中我们看到在resources目录中有一个application.properties文件,这个文件就是让我们个性化配置SpringBoot项目参数的,也就是说,在这个文件中按照SpringBoot为我们提供的参数名,就可以直接修改SpringBoot项目的默认参数。下面我们尝试修改SpringBoot项目的默认端口。具体修改如下:

  在application.properties文件中添加下面的参数,然后,启动application.properties文件项目即可。

server.port=8081

  并且如果我们使用IDEA开发工具时,当我们在在application.properties文件中输入参数时,IDEA就会自动为我们提供相关参数提示,这样方便我们修改。也就是如下图所示:

  title

  这时我们启动SpringBoot项目并且用8080端口访问项目时,发现已经找不到服务了。

  title

  而如果我们用访问8081端口访问项目,则发现服务可以正常访问。这就说明,我们已经成功将SpringBoot项目的默认端口修改为8081端口了。

  title

  虽然上面的方式已经成功的修改了SpringBoot项目的默认参数,但在实际的开发中,并不推荐使用application.properties文件的方式修改,因为在SpringBoot项目中有更推荐的方式。也就是使用yml文件的方式。


application.yml文件

  使用yml文件的方式修改默认参数,也比较简单,也就是把application.properties文件文件修改为application.yml文件即可。唯一不同的方式,就是yml文件有自己独特的语法,和properties文件不同,可以省略很多参数,并且浏览比较直观。下面我们尝试用yml文件的方式,将SpringBoot的端口修改为8082端口。

  title

  启动项目后访问刚刚的8081端口,发现项目已经访问不了。

  title

  这时我们访问8082端口,发现项目访问又正常了,这就说明我们使用yml的方式修改SpringBoot的默认参数方式成功了。

  如果我们访问http://localhost:8082/jilinwula/helloworld地址,即可看到SpringBoot接口返回的数据。

  title

修改默认项目名

  下面我们还将使用yml的方式配置SpringBoot项目的项目名。具体参数如下:

server:
  port: 8082
  context-path: /springboot

  我们继续启动项目然后依然访问http://localhost:8082/jilinwula/helloworld地址,这时发现接口访问失败。

  title

  然后我们访问http://localhost:8082/springboot/jilinwula/helloworld地址,发现服务又可正常访问了。

  title


获取配置文件中参数

  在实际的项目开发中,我们通常会遇到,读取配置文件中的参数,那么在SpringBoot中怎么获取配置文件中的参数呢?下面我们在配置文件中添加如下参数。

server:
  port: 8082
  context-path: /springboot
email:
  username: jilinwula
  password: 123456

  下面我们在Controller中采用如下的方式读取配置文件中的参数。

@RestController
@RequestMapping("/jilinwula")
public class JilinwulaController {

    @Value("${email.username}")
    private String username;

    @Value("${email.password}")
    private String password;

    @RequestMapping("/helloworld")
    public Object helloWorld() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("username", username);
        map.put("password", password);
        return map;
    }

}

  我们可以直接使用@Value注解来获取配置文件中的参数,并且这个注解不只是在SpringBoot中可以使用,这个注解在Spring的项目中也可以使用。下面我们启动项目,并访问http://localhost:8082/springboot/jilinwula/helloworld地址,看看是不是可以成功的获取配置文件中的参数。

  title

  我们看上图所示,我们成功的获取到了配置文件中的参数。但如果有强迫证的人,对于上面的代码难免有些不满意。因为如果我们要获取配置文件中非常多的参数时,要是按照上面的代码编写,则需要在代码中编写大量的@Value注解,这显然是不合理的。那有没有比较方便的办法呢?答案一定是有的,并且SpringBoot为我们提供了非常方便的方法获取配置文件中的参数。下面我们看一下这种方式。

  我们首先要在项目的pom.xml中添加以下依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>

  第一个依赖是自动获取配置文件参数的必须依赖,而下面的依赖,则是可以用注解的方式动态生成get和set方法,这样我们在开发时,就不用在写get和set方法了,在实际的项目中比较常用。在使用lombok生成get和set方法时,还要在IDEA中添加相应的lombok插件,否则IDEA会提示到不到get和set方法的警告。

  title

  其次我们新创建一下获取配置参数的类,并且添加@ConfigurationProperties注解,该注解会自动将配置文件中的参数注入到类中的属性中(不需要写@Value注解)。并且可以指定prefix参数来指定要获取配置文件中的前缀。具体代码如下:

package com.jilinwula.springboot.helloworld;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Component
@ConfigurationProperties(prefix = "email")
@Data
public class EmailProperties {
    private String username;
    private String password;
}

  上面中的@Data,注解就是动态生成get和set方法的所以上述的代码是不需要写get和set方法的。下面我们看一下Controller中的代码修改:

package com.jilinwula.springboot.helloworld;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/jilinwula")
public class JilinwulaController {

    @Autowired
    private EmailProperties emailProperties;

    @RequestMapping("/helloworld")
    public Object helloWorld() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("username", emailProperties.getUsername());
        map.put("password", emailProperties.getPassword());
        return map;
    }

}

  下面我们启动项目并访问接口看看是否能够成功获取配置文件中的参数。

  title

  )


  下面我们介绍一下在SpringBoot中怎么处理不同环境中获取不同的配置参数。下面我们模拟两人环境一个是开发环境,一个是测试环境,我们暂时以不同端口来区分这两个环境的区别。

  application-dev.yml:

server:
  port: 8081
  context-path: /springboot
email:
  username: jilinwula
  password: 123456

  application-test.yml:

server:
  port: 8082
  context-path: /springboot
email:
  username: jilinwula
  password: 654321

  application.yml:

spring:
  profiles:
    active: dev

  这样当我们在application.yml文件中的参数设置为dev时,SpringBoot项目在启动时就会读取application-dev.yml中的参数。如果我们将参数设置为test时,则SpringBoot会读取application-test.yml文件中的参数。

  下面我们分别启动项目并且访问接口:

  title

启动时指定参数

  在上一篇中我们已经介绍过了我们可以使用java -jar 项目的名字的方式启动SpringBoot项目。并且,该方式还支持指定SpringBoot参数,例如上面刚刚介绍的指定获取同环境的配置参数。具体命里如下:

java -jar jilinwula-springboot-helloworld-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

  我们此时继续访问接口发现还是成功的获取了dev环境中的参数。

  title


  上述内容就是SpringBoot个性化配置的内容,如有不正确,或者需要交流的,欢迎留言,谢谢。 下面为项目源码:https://github.com/jilinwula/jilinwula-springboot-helloworld2