SpringBoot的管理配置

2023-07-05  本文已影响0人  NengLee

Spring 3.0 之前,要使用 Spring 的组件就必须要有一个 XML 配置文件,这也是Spring 的核心配置文件,而 Spring 3.0 之后就可以不要 XML 配置文件了,可以通过新的@Configuration注解代替 XML 配置文件

文件格式

properties (优先) 》 yml (yaml)
# properties
app.memo=这个是.proprtties默认的配置文件-默认环境
app.name=ALeeSpringWeb
app.owner=changming
app.port=8080
# yml   注意空格和缩颈
app:
  memo: 这个是yml默认的配置文件-默认环境
  name: ALeeSpringWeb
  owner: changMing001
  port: 8081

文件名称: 默认application

  1. application.properties
  2. application.yml

环境对象:Environment:表示抽象的所有key和value,方法getProperty(key) [在读取方式会介绍具体用法]

多文件

自定义独立的配置文件,使用Spring.config.import = 文件路径。

spring:
  config: # 导入其他的配置文件 , 多个文件使用 “,” 作为分隔符
    import: config/db.yml,config/redis.yml

多环境

开发环境、测试、上线、特性、bug环境等等

spring:
  profiles: # 激活某个配置环境  application-xxx-.yml
    active: dev  #默认是 application.yml  

读取数据

一、通过 @value

@value("${key}")

@Service
public class HelloService {

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

    @Value("${app.owner}")
    private String appOwner;

    @Value("${app.port:8001}")
    private String appPort;


    public void printValue() {
        StringJoiner stringJoiner = new StringJoiner(",");
        stringJoiner.add(appName).add(appOwner).add(appPort);

        System.out.println("resurlt: " + stringJoiner);
    }
}

二、通过 Environment

Environment.getPropery("key")

@Service
public class ReadConfig {

    //注入环境对象
    private final Environment environment;

    public ReadConfig(Environment environment) {
        this.environment = environment;
    }

    public void print() {

        String name = environment.getProperty("app.name");

        if (environment.containsProperty("app.owner")) {
            System.out.println("owner 存在");
        } else {
            System.out.println("owner 不存在");
        }

        //没有数值,提供默认值
        int port = environment.getProperty("app.port", Integer.class, 9001);

        String str = String.format("读取的数值为 name=%s , port=%d", name, port);
        System.out.println(str);
    }
}

三、通过 @Bean 用于多个属性(推荐)

@Configuration(proxyBeanMethods = true)  //proxyBeanMethods 默认True ApringCGLIB 代理容器 / false单独普通Bean、不放入容器
@ConfigurationProperties(prefix = "app")
public class AppBean {

    private String memo; 
    private String name; 
    private String owner;
    private Integer port;

    // get & set ...

    @Override
    public String toString() {
        return "AppBean{" +
                "memo='" + memo + '\'' +
                ", name='" + name + '\'' +
                ", owner='" + owner + '\'' +
                ", port='" + port + '\'' +
                '}';
    }
}

注解 @ Configuration(proxyBeanMethods = true)

注解 @ConfigurationProperties

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {
    @AliasFor("prefix")
    String value() default "";

    @AliasFor("value")
    String prefix() default "";

    boolean ignoreInvalidFields() default false;

    boolean ignoreUnknownFields() default true;
}

位置:

  1. 在类的上面,需要有源代码
  2. 在方法的上面,使用第三方对象,配合@Bean注解
数据的来源
  1. application文件,[properties 或者 yml]
  2. 指定数据的来源 @PropertySource(value = "classpath:/config/pathsource.properties") ,需要注意默认不支持yml的配置,必须要用要写配置配置工厂

注意:

#config/pathsource.properties

group.memo=这个是测试环境配置文件-group
group.name=ALeeSpringWeb-group
group.owner=changMing-group
group.port=8082
//指定数据的来源
    
@Configuration
@ConfigurationProperties(prefix="group")
@PropertySource(value  = "classpath:/config/pathsource.properties")  
public class PathAppBean {

    private String memo; 
    private String name; 
    private String owner;
    private Integer port;
    //set、get省略...
}
yml配置工厂 YamlPropertySourceFactory.class
@Configuration
@ConfigurationProperties(prefix = "group-yml")
@PropertySource(value = "classpath:/config/pathsource.yml", factory = YamlPropertySourceFactory.class)
public class PathYmlAppBean {
    
    private String memo; 
    private String name; 
    private String owner;
    private Integer port;
    //set、get省略...
}
配置工厂、重写 DefaultPropertySourceFactory
package com.example.alee.ALeeSpringWeb.factory;

import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {

    @Override
    public org.springframework.core.env.PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        Resource resourceResource = resource.getResource();
        System.out.println("resource Resource info");
        if (!resourceResource.exists()) {
            System.out.println("resource not exist");
            return new PropertiesPropertySource(null, new Properties());
        } else if (
                resourceResource.getFilename().endsWith(".yml") ||
                        resourceResource.getFilename().endsWith(".yaml")) {
            System.out.println("resourceResource = {}" + resourceResource.getFilename());

            List<PropertySource<?>> sources = new YamlPropertySourceLoader()
                    .load(resourceResource.getFilename(), resourceResource);
            return sources.get(0);
        }
        return super.createPropertySource(name, resource);
    }
}

自动配置

自动配置文件的命名可以有以下参考配置类:

End。


简书·SpringBoot的管理配置

git 项目仓库

上一篇下一篇

猜你喜欢

热点阅读