首页 > 其他分享 >Spring Boot 配置文件

Spring Boot 配置文件

时间:2023-01-17 11:35:46浏览次数:43  
标签:name 配置文件 Spring Boot yml private public properties

Spring Boot 配置文件

Spring Boot 官方提供了两种常用的配置文件格式,分别是properties、yml格式。相比于properties来说,yml更加年轻,层级也是更加分明。

properties 和 yml 两者之间区别:

  • properties 文件以"." 进行分割,yaml以":"进行分割
  • properties 文件通过 “=” 赋值,yml 的数据格式类似json,通过 “=” 赋值,值前面需要加一个空格;yml文件缩进最好用空格
  • properties 只支持键值对,yml 配置文件支持列表,短横线 “-” 表示列表
  • properties 不保证加载顺序,yml 有先后顺序

properties 文件

Java 中的 properties 文件是一种配置文件,主要用于表达配置信息,文件类型为 “.properties”,格式为文本文件,这种文件以 key=value 格式存储内容。
Properties 类继承自 Hashtable,是线程安全的,多个线程可以共享单个properties 对象而无需进行外部同步。
一般这个文件作为一些参数的存储,代码可以灵活一点。通俗点讲就相当于定义一个变量,在这个文件里面定义这些变量的值,在程序里面可以调用这些变量,好处就是,如果程序中的参数值需要变动,直接修改这个 “.properties” 文件就可以了,不用去修改源代码。

properties 文件案例

application.properties

userinfo.name=example
userinfo.age=25
userinfo.active=true
userinfo.created-date=2023/01/06 11:20:20
userinfo.map.k1=v1
userinfo.map.k2=v2

UserInfo.java

@Data
@ToString
public class UserInfo {
    private String name;
    private Integer age;
    private Boolean active;
    private Map<String, Object> map;
    private Date createdDate;
    private List<String> hobbies;
}

YML 文件

yml 文件是 spring boot 推荐使用的配置文件格式,它相较于 properties 格式文件更强大,比如可以实现 SpEl表达式、松散绑定等。
以空格的缩进程度来控制层级关系。空格的数量并不重要,只要左边空格对齐则视为同一个层级。不能用 tab 代替空格,且大小写敏感。支持字面值、对象和数组三种数据结构,也支持复合结构。

  • 字面值:字符串、布尔类型、数值、日期。字符串默认不加引号,单引号会转义字符。日期格式支持 yyyy/MM/dd HH:mm:ss
  • 对象:由键值对组成,形如 key: (空格)value 的数据组成。冒号后面的空格是必须要有的,每组键值对占用一行,且缩进的程度要一致,也可以使用行内写法:{k1" v1, ... k2: v2}
  • 数组:由形如 - (空格)value 的数据组成。短横线后面的空格必须要有的,每组数据占用一行,且缩进的程度要一致,也可以使用行内写法:[1, 2, ... n]
  • 复合结构:上面三种数据结构任意组合

yml 文件案例

application.yaml

UserInfo:
  name: example
  age: 25
  active: true
  created-date: 2023/01/06 11:40:00
  map: {k1: v1, k2: v2}
  hobbies:
    - football
    - basketball
    - ping-pong ball

UserInfo.java

@Data
@ToString
public class UserInfo {
    private String name;
    private Integer age;
    private Boolean active;
    private Map<String, Object> map;
    private Date createdDate;
    private List<String> hobbies;
}

注意

  • 字符串可以不加引号,若加双引号则输出特殊字符,若不加或加单引号则转义特殊字符
  • 数组类型,短横线后面有空格;对象类型,冒号后面要有空格
  • YAML 是以空格缩进的程度来控制层级关系,但不能用 tab 键代替空格,大小写敏感

从配置文件取值

@ConfigurationProperties

这个注解用于从配置文件中取值,支持复杂的数据类型,但是不支持 SPEL 表达式。
该注解中有一个属性 prefix, 用于指定获取配置的前缀,毕竟配置文件中的属性很多,也有很多重名的配置,所以必须用一个前缀来区分下。
该注解可以标注在上也可以标注在方法上,所以它有两种获取值的方式。

标注在实体类上

这种方式用于从实体类上取值,并且赋值到对应的属性。

/**
 * @Component 注入到 IOC 容器中
 * @ConfigurationProperties 从配置文件中读取数据
 */
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "userinfo")
public class UserInfo {
    private String name;
    private Integer age;
    private Boolean active;
    private Map<String, Object> map;
    private Date createdDate;
    private List<String> hobbies;
}

在 controller 中注入配置类后进行使用

@RestController
@RequestMapping("demo")
public class DemoController {
    
    @Autowired
    private UserInfo userInfo;
    
    @GetMapping("test")
    public String demoTest() {
        return JSON.toJSONString(userInfo);
    }
}

访问对应的 url 之后可以看到在配置文件中配置的信息已经获取到

{"active":true,"age":25,"createdDate":"2023-01-06 11:20:20","hobbies":["football","basketball","ping-pong ball"],"map":{"k1":"v1","k2":"v2"},"name":"example"}

标注在配置类中的方法上

标注在配置类上的方法上,同样是从配置文件中取值赋值到返回值的属性中

/**
 * @Bean 将返回的结果注入到 IOC 容器中
 * @ConfigurationProperties 从配置文件中取值
 * @return
 */
@ConfigurationProperties(prefix = "userinfo")
@Bean
public UserInfo userInfo() {
    return new UserInfo();
}

总结:@ConfigurationProperties 注解能够很轻松的从配置文件中取值,优点如下:

  • 支持批量的注入属性,只需要指定一个前缀 pregix
  • 支持复杂的数据类型,比如 List, Map
  • 对属性名匹配的要求较低,比如 user-name, user_name, userName, USER_NAME 都可以取值
  • 支持 Java 的 JSR303 数据校验

注意:@ConfigurationProperties 注解仅仅支持从 spring boot 的默认配置文件中取值,比如 application.properties, application.yml, application.yaml

@Value

@Value 这个注解应该是很熟悉了,spring 中从属性取值的注解,支持 SPEL 表达式,不支持复杂的数据类型,比如 List

@RestController
@RequestMapping("demo")
public class DemoController {

    @Value("${userinfo.name}")
    private String name;

    @GetMapping("test")
    public String demoTest() {
        return JSON.toJSONString(name);
    }
}

访问对应的 url 之后可以看到在配置文件中配置的信息已经获取到

"example"

该注解只能是获取到配置的某一条属性值,不能获取到整个对象的属性配置并封装类

从自定义配置文件中取值

spring boot 在启动的时候会自动加载 application.xxx 配置文件,但为了区分,有时候需要自定义一个配置文件,读取这种自定义文件,就需要配合 @propertySource 注解来获取自定义配置文件了,只需要在启动类上标注 @PropertySource 并指定自定义的配置文件即可。

// 文件名称 customConfig.properties
student.name=example
student.age=20
student.birthday=2022/01/06 15:00:00

实体类

@Data
@ToString
@Component
@ConfigurationProperties(prefix = "student")
public class Student {

    private String name;

    private Integer age;

    private Date birthday;
}

启动类

@SpringBootApplication
@PropertySource(value = {"classpath:customConfig.properties"})
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

value 属性是一个数组,可以指定多个配置文件同时引入。
@PropertySource 默认加载 application.properties,不能加载 yml 格式的配置文件,yml 配置文件需要另外处理。
controller

@RestController
@RequestMapping("demo")
public class DemoController {

    @Autowired
    private Student student;

    @GetMapping("test")
    public String demoTest() {
        return JSON.toJSONString(student);
    }
}

启动后访问对应的 url 可以查看到已经能够读取到配置文件属性并对数据进行封装了,能够获取到

{"age":20,"birthday":"2022-01-06 15:00:00","name":"example"}

加载自定义 YML 格式的配置文件

@PropertySource 注解有一个属性 factory,默认是 PropertySourceFactory.class,这个就说用来加载 properties 格式的配置文件,我们可以自定义一个用来加载 yml 格式的配置文件。

public class YmlConfigFactory extends DefaultPropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        String sourceName = name != null ? name : resource.getResource().getFilename();
        if (!resource.getResource().exists()) {
            return new PropertiesPropertySource(sourceName, new Properties());
        } else if (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml")) {
            Properties propertiesFromYaml = loadYml(resource);
            return new PropertiesPropertySource(sourceName, propertiesFromYaml);
        } else {
            return super.createPropertySource(name, resource);
        }
    }

    private Properties loadYml(EncodedResource resource) throws IOException {
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        factory.setResources(resource.getResource());
        factory.afterPropertiesSet();
        return factory.getObject();
    }
}

启动类

@SpringBootApplication
@PropertySource(value = {"classpath:customConfig.yml"}, factory = YmlConfigFactory.class)
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

经过测试,可以实现和 properties 自定义配置文件一样的效果。
@PropertySource 指定加载自定义配置文件,默认只能加载 properties 格式,但是可以指定 factory 属性来加载 yml 格式的配置文件。

标签:name,配置文件,Spring,Boot,yml,private,public,properties
From: https://www.cnblogs.com/wangms821/p/17057425.html

相关文章

  • Spring Boot 日志文件
    SpringBoot日志文件日志文件是用于记录系统操作事件的记录文件或文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。......
  • nginx 配置文件解析
    #usernobody;#工作进程数,一般设置为cpu核心数worker_processes4;worker_rlimit_nofile65535;#error_loglogs/error.log;#error_loglogs/error.lognotice......
  • SpringCloud学习(1)
    今天学习谷粒商城的openfeign远程调用的时候,启动项目后报错nestedexceptionisjava.lang.IllegalStateException:NoFeignClientforloadBalancingdefined.Didyou......
  • 学习笔记——Spring底层IOC实现;Spring依赖注入数值问题;Spring依赖注入方式
    2023-01-14一、Spring底层IOC实现1、IOC:将对象的控制器反转给Spring2、BeanFactory与ApplicationContext(1)BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,是面向......
  • spring 管理的线程池实现优雅关闭
      创建线程池时, setWaitForTasksToCompleteOnShutdown  setAwaitTerminationSeconds//将ThreadPoolTaskExecutor实例交给Spring管理@BeanpublicThreadPool......
  • Spring-正确使用AOP
    正确使用AOP,我们需要一个避坑指南:访问被注入的Bean时,总是调用方法而非直接访问字段;编写Bean时,如果可能会被代理,就不要编写publicfinal方法。这样才能保证有没有AOP,代......
  • Spring 依赖注入
    依赖注入(DI)是一种设计模式,可以从编程代码中删除依赖,以便可以轻松管理和测试应用程序。依赖注入使我们的编程代码松散耦合。为了更好地理解DI,让我们首先了解依赖关系查......
  • Spring IoC容器
    IoC容器负责实例化,配置和组装对象。IoC容器从XML文件获取信息并相应地工作。IoC容器执行的主要任务是:实例化应用程序类配置对象组装对象之间的依赖关系 有两种类......
  • SpringBoot自定义starter
    SpringBoot自定义starter目录SpringBoot自定义starter1自定义starter1.1新建project和Module1.2对于starter-provider1.3install1.4对于starter-user1.5测试2执行......
  • spring 创建应用
    在这里,我们将使用eclipseIDE创建一个spring框架的简单应用程序。让我们看看在EclipseIDE中创建spring应用程序的简单步骤。在EclipseIDE中创建spring应用程序的步骤......