zoukankan      html  css  js  c++  java
  • 深入理解SpringBoot配置

    一、application.properties的位置

    1.当前目录的 “/config”的子目录下
    2.当前目录下
    3.classpath根目录的“/config”包下
    4.classpath的根目录下

    spring会从classpath下的/config目录或者classpath的根目录查找application.properties或application.yml。

    /config优先于classpath根目录

    说明:

    1. 1,2两项适合生产环境,可以直接跟jar包放在同级目录下
    2. 如果同时在四个地方都有配置文件,配置文件的优先级是从1到4。
    3. 使用配置文件之后,spring boo启动时,会自动把配置信息读取到spring容器中,并覆盖spring boot的默认配置

    SpringBoot的配置方式有很多,它们的优先级如下所示(优先级递减顺序):

    1. 命令行参数
    2. 来自java:comp/env的JNDI属性
    3. Java系统属性(System.getProperties())
    4. 操作系统环境变量
    5. RandomValuePropertySource配置的random.*属性值
    6. jar包外部的application-{profile}.propertiesapplication.yml(带spring.profile)配置文件
    7. jar包内部的application-{profile}.propertiesapplication.yml(带spring.profile)配置文件
    8. jar包外部的application.propertiesapplication.yml(不带spring.profile)配置文件
    9. jar包内部的application.propertiesapplication.yml(不带spring.profile)配置文件
    10. @Configuration注解类上的@PropertySource
    11. 通过SpringApplication.setDefaultProperties指定的默认属性

    因为jar包外部的优先级高,所以可以运行时指定application.properties的位置。
    以上配置方式虽然挺多,实际用到的只有一两种。

    二、 通过命令行来配置少量项

    SpringBoot可以不依赖Tomcat容器,作为单应用启动。这时,可以通过命令行来控制运行参数。
    通过命令行来重写和配置环境变量,优先级最高,例如可以通过下面的命令来重写spring boot 内嵌tomcat的服务端口,注意“=”俩边不要有空格
    java -jar demo.jar --server.port=9000
    如果想要设置多个变量怎么办,可以用json的格式字符串来设置
    java -jar demo.jar --spring.application.json='{"foo":"bar"}'

    三、 使用@Value注解

    @RestController
    @RequestMapping("/task")
    public class TaskController {
    
    @Value("${connection.remoteAddress}") private String address;
    
    @RequestMapping(value = {"/",""})
    public String hellTask(@Value("${connection.username}")String name){
    
        return "hello task !!";
    }
    }
    

    @Value注解有好几种姿势:
    1. #{expression?:default value}

    @Value("#{systemProjecties['mongodb.port']?:27017}")
    private String mongodbPort;
    @Value("#{config['mongodb.url']?:'127.0.0.1'}")
    private String mongodbUrl;
    @Value("#{aBean.age ?:21}")
    private int age;
    

    2. ${property:default value}

    //@propertySource("classpath:/config.properties")
    //configuration
    @Value("${mongodb.url:127.0.0.1}")
    private String mongodbUrl;
    @Value("#{'${mongodb.url:172.0.0.1}'}")
    private String mongoUrl;
    @Value("#config['mongodb.url']?:'127.0.0.1'")
    private String mogodbUrl;
    

    配置文件config.property如下:

    mogodb.url = 1.2.3.4
    mogodb.db = hello
    

    3. 注意
    Must register a static PropertySourcesPlaceholderConfiger bean in either XML or annotation ,so that Spring @Value konw how to interpret ${}

    //@PropertySource("classpath:/config.properties}")
    //@Configuration
      @Bean
      public static PropertySourcesPlaceholderConfigurer propertyConfigIn() {
             return new PropertySourcesPlaceholderConfigurer();
      }
    

    四、 属性的引用

    myapp.name=spring
    myapp.desc=${myapp.name} nice
    SpringBoot提供以下特殊引用:
    my.secret=${random.value}
    my.number=${random.int}
    my.bignumber=${random.long}
    my.number.less.than.ten=${random.int(10)}
    my.number.in.range=${random.int[1024,65536]}
    

    五、 自定义配置信息

    @Component
    public class SystemConfig {
    
        private static Properties props ;
    
        public SystemConfig(){
    
            try {
                Resource resource = new ClassPathResource("/application.properties");//
                props = PropertiesLoaderUtils.loadProperties(resource);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 获取属性
         * @param key
         * @return
         */
        public static String getProperty(String key){
    
            return props == null ? null :  props.getProperty(key);
    
        }
    
        /**
         * 获取属性
         * @param key 属性key
         * @param defaultValue 属性value
         * @return
         */
        public static String getProperty(String key,String defaultValue){
    
             return props == null ? null : props.getProperty(key, defaultValue);
    
        }
    
        /**
         * 获取properyies属性
         * @return
         */
        public static Properties getProperties(){
            return props;
        }
    
    }
    
    //用的话,就直接这样子
    String value = SystemConfig.getProperty("key");
    

    六、SpringBoot自带的配置属性

    常用属性如日志,端口配置

    # LOGGING
    logging.path=/var/logs
    logging.file=myapp.log
    logging.config= # location of config file (default classpath:logback.xml for logback)
    logging.level.*= # levels for loggers, e.g. "logging.level.org.springframework=DEBUG" (TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF)
    
    # EMBEDDED SERVER CONFIGURATION (ServerProperties)
    server.port=8080
    server.address= # bind to a specific NIC
    server.session-timeout= # session timeout in seconds
    server.context-parameters.*= # Servlet context init parameters, e.g. server.context-parameters.a=alpha
    server.context-path= # the context path, defaults to '/'
    server.servlet-path= # the servlet path, defaults to '/'
    

    更多属性参见官网文档

    @ContextConfiguration
    @ContextConfiguration(locations={"classpath*:mongodb.xml"})

    七、属性名匹配规则

    例如有如下配置对象:

    @Component
    @ConfigurationProperties(prefix="person")
    public class ConnectionSettings {
    
        private String firstName;
    
    } 
    

    firstName可以使用的属性名如下:

    person.firstName,标准的驼峰式命名
    person.first-name,虚线(-)分割方式,推荐在.properties和.yml配置文件中使用
    PERSON_FIRST_NAME,大写下划线形式,建议在系统环境变量中使用

    参考资料

    偶尔记一下

  • 相关阅读:
    Servlet项目 创建方法
    1. 连接数据库
    Jsp application对象(全局变量)
    Jsp session属性、方法
    让python 3支持mysqldb的解决方法
    Python读写文件(进阶)
    python操作MongoDB
    使用Python Pandas处理亿级数据
    SurfingTheInternet
    matplotlib中日期显示(不显示为科学计数法)
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6820923.html
Copyright © 2011-2022 走看看