SpringBoot详解配置文件

上篇简单了解了SpringBoot的概念并学会如何搭建一个SpringBoot项目,今天就来学习SpringBoot的配置文件的种类与用法

前景引入

在学习SpringBoot之前,SSM项目的配置复杂程度堪称配置地狱,一开始开发者就对Spring、SpringMVC、Mybatis、tomcat进行配置,这浪费了我们大量的时间去构建项目,而且如果配置一旦出现错误,项目就有可能崩溃。

SpringBoot采用了自动配置,以前需要配置的东西,Spring Boot帮我们自动配置,使得开发者更加关注于业务代码的开发

什么是SpringBoot自动配置?

  • 指的是基于你引入依赖的jar包,对SpringBoot应用自动配置

  • 它为SpingBoot框架“开箱即用”提供了基础支撑

使用过SpringBoot的都知道启动类中使用了@SpringBootApplicatin注解,打开源码我们查看一下元注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {
   
   @Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "nameGenerator"
    )
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

我们主要关注三个元注解,分别为@SpringBootConfiguration、@E nableAutoConfiguration、@ComponentScan
1、@SpringBootApplication修饰的类,也会被@Configuration间接修饰,即“源配置类”

2、SpringBoot框架会对“源配置类”所在的package进行组件扫描

3、SpringBoot框架最终会导入AutoConfigurationImportSelector来实现自动配置

配置文件分类

  • SpringBoot提供了两种能被识别的配置文件,分别为properties和yaml/yml文件

  • 在同一级目录下优先级为:properties > yml > yaml

  • 默认配置文件名称:application

yml/yaml文件类型

概念: YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格 式,并且容易被人类阅读,也容易和脚本语言交互

语法与特点:

  • 大小写铭感

  • 数据值前边必须有空格,作为分隔符

  • 使用缩进表示层级关系

  • 缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)

  • 缩进的空格数目不重要,只要相同级的元素左侧对齐即可

示例:以定义服务器端口和主机为例

server
  port: 8080
  address: 127.0.0.1

数据类型定义

对象(map)

person:
 name: zhangsan
#行内写法
person: {name: zhangsan}

数组(array)

address:
 - beijing
 - shangsai
# 行内写法
address: {beijing,shanghai}

常量

msg1: 'hello \n world'   #单引忽略转义字符
msg2: "hello \n world"  #双引识别转义字符

同类比较

下面我们将yml与properties和xml文件格式进行比较

  • xml

<server>
  <port>8080</port>
  <address>127.0.0.1</address>  
</server>
  • properties

server.port=8080
server.address=127.0.0.1
  • yml

server
  port: 8080
  address: 127.0.0.1

区别:
1、xml文件主要是树形结构,xml配置文件结构清晰,但是内容比较繁琐
2、properties文件主要是以key-value键值对的形式存在,文件结构简单,但难以表达层次
3、yml文件不是一种标记语言,但容易表现层级关系,而且语法简洁精炼

获取配置文件数据

SpringBoot提供了以下三个注解来获取配置文件数据
@Value
@Environment
@ConfigurationProperties

  • 第一种方式,使用@Value yml文件

  user1:
    name: zhangsan

1、Controller层,获取对象数据(user1.name)

  @Controller
  public class HelloController {
      @Value("${user1.name}")
      private String name;
  
      @ResponseBody
      @RequestMapping("/param")
      public String hello(){
          System.out.println(name);
          return "param";
      }
  
  }

2、获取数组数据
yml文件:

country: [China,Italy]

Controller测试

@Controller
public class HelloController {
    @Value("${user1.name}")
    private String name;

    @Value("${country[0]}")
    private String country1;

    @ResponseBody
    @RequestMapping("/param")
    public String hello(){
        System.out.println("country1 : "+country1);
        return "param";
    }

}
  • 第二种方式,使用Environment对象获取数据,这个方法比较方便

    在Controller层,创建Environment对象,并自动注入,然后使用对象的getProperty方法获取数据

  @RestController
  public class Test1Controller {
      @Autowired
      Environment env;
  
      @RequestMapping("/test1")
      public String test1(){
          System.out.println("country[0] : "+env.getProperty("country[0]"));
          System.out.println("user1.name : " + env.getProperty("user1.name"));
          return "test1";
      }
  }

输出如下:

  country[0] : China
  user1.name : zhangsan
  • 方式三:使用@ConfigurationProperties获取数据

    首先创建一个Bean,加上@ConfigurationProperties注解,还有一定要加上prefix前缀

    注意:Bean成员一定要跟yml的数据一一对应

@Component
@ConfigurationProperties(prefix = "admin")
public class Admin {
    private String userName;
    private String password;
    private String[] hobby;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password=password;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }
}

然后在Controller层,创建一个Admin对象,并自动注入

@RestController
public class Test1Controller {
    @Autowired
    private Admin admin;

    @RequestMapping("/test2")
    public String test2(){
        System.out.println("userName: "+admin.getUserName());
        System.out.println("password: "+admin.getPassword());
        for (String hobby : admin.getHobby()) {
            System.out.println(hobby);
        }
        return "test2";
    }
}

输出:

userName: admin
password: 123
music
play game

至此,本篇内容结束,如果你喜欢本篇,欢迎点赞+关注,前方不迷路,祝各位生活愉快!

猜你喜欢

转载自blog.csdn.net/calm_programmer/article/details/126119968