美文网首页
SpringBoot的管理配置

SpringBoot的管理配置

作者: NengLee | 来源:发表于2023-07-05 15:06 被阅读0次

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

    文件格式

    properties (优先) 》 yml (yaml)
    • properties格式: key=value
    # properties
    app.memo=这个是.proprtties默认的配置文件-默认环境
    app.name=ALeeSpringWeb
    app.owner=changming
    app.port=8080
    
    • yml格式: key: value
    # 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环境等等

    • application-dev.yml 开发

    • application-test.yml 测试

    • application-feature.yml 特性

    • application-prod.yml 线上

    • application-bug.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)

    • proxyBeanMethods 默认true ApringCGLIB 代理容器
    • false单独普通Bean、不放入容器 ,独立容器不依赖

    注解 @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的配置,必须要用要写配置配置工厂

    注意:

    • 类中有无参数的构造方法
    • 属性有setXXX方法
    • static 属性无效
    • 使用Bean的构造方法也能创建对象,
    #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);
        }
    }
    

    自动配置

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

    • MybatisConfiguration: Mybatis配置
    • MainConfiguration: 项目主要配置
    • DataSoureceConfiguration: 数据源配置
    • RedisConfiguration: Redis 配置
    • MongoDBConfiguration: MongoDB 配置
    • ...

    End。


    简书·SpringBoot的管理配置

    git 项目仓库

    相关文章

      网友评论

          本文标题:SpringBoot的管理配置

          本文链接:https://www.haomeiwen.com/subject/jfekudtx.html