springboot之properties

本例将采用maven管理,代码托管在github上,地址:https://github.com/wolf909867753/springboot

1。创建maven-module,properties,并在pom.xml中添加springboot依赖


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <artifactId>properties</artifactId>
    <packaging>war</packaging>
    <name>springboot-properties Demo</name>
    <url>http://maven.apache.org</url>

    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <dependencies>
        <!-- Spring Boot Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <finalName>properties</finalName>
    </build>
</project>

工程目录如下:


代码参考github code


使用application.properties配置文件加载的测试DEMO
        参考com.springboot.properties此包下的code
1.创建HomeProperties类

@Component
@ConfigurationProperties(prefix="home")
public class HomeProperties {

    /**
     * 省份
     */
    private String province;

    /**
     * 城市
     */
    private String city;

    /**
     * 描述
     */
    private String desc;

    getter/setter.....
}

2.配置文件
    application-pro.properties

      home.province = shang dong sheng
      home.city = wei fang shi
      home.desc = [application-pro] i come from ${home.province} ${home.city}.

    application-dev.properties

      home.province = shandong
      home.city = weifang
      home.desc = [application-dev] i come from ${home.province}--${home.city}

    application.properties

      spring.profiles.active=pro

3.测试
    参考test下com.springboot.properties.PropertiesTest.java


@SpringBootApplication
public class PropertiesTest implements CommandLineRunner{

    @Autowired
    private HomeProperties homeProperties;

    @Override
    public void run(String... strings) throws Exception {
        System.out.println(">>>>>>>>>>>>>>  "+homeProperties.toString());
    }
    /**
     * 使用application.yml运行输出以下结果:
     *  HomeProperties{province='山东省', city='潍坊市', desc='我来自山东省潍坊市.'}
     *
     *  使用application.properties根据spring.profiles.active的value运行加载其对应的application-*.properties输出以下结果:
     *  HomePropertiesYML{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}
     */
    public static void main(String[] args) {
        SpringApplication.run(PropertiesTest.class,args);
    }
}


运行main方法,加载使用application.properties根据spring.profiles.active的value运行加载其对应的application-*.properties输出以下结果:
HomeProperties{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}


=======================================================================================


使用application.yml配置文件加载的测试DEMO
 参考com.springboot.properties此包下的code
1.创建HomePropertiesYML.java

@Component
public class HomePropertiesYML {

    /**
     * 省份
     */
    @Value("${home.province}")
    private String province;

    /**
     * 城市
     */
    @Value("${home.city}")
    private String city;

    /**
     * 描述
     */
    @Value("${home.desc}")
    private String desc;
    getter/setter....

}
2.配置文件
    application.yml 注意项目下不能同时存在application.properties 和 application.yml
    
home:
  province : 山东省
  city : 潍坊市
  desc : 我来自${home.province}${home.city}.

    
3.测试
    参考test下com.springboot.properties.YMLpropertiesTest.java
    
@SpringBootApplication
public class YMLpropertiesTest implements CommandLineRunner {

    @Autowired
    private HomePropertiesYML homePropertiesYML;
    @Override
    public void run(String... strings) throws Exception {
        System.out.println(">>>>>>>>>>>> "+homePropertiesYML.toString());
    }
    /**
     * 使用application.yml运行输出以下结果:
     *  HomePropertiesYML{province='山东省', city='潍坊市', desc='我来自山东省潍坊市.'}
     *
     *  使用application.properties根据spring.profiles.active的value运行加载其对应的application-*.properties输出以下结果:
     *  HomePropertiesYML{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}
     */
    public static void main(String[] args) {
        SpringApplication.run(YMLpropertiesTest.class,args);
//        System.exit(-1);
    }

}

运行main方法,加载使用application.yml配置文件,输出以下结果:
 HomePropertiesYML{province='山东省', city='潍坊市', desc='我来自山东省潍坊市.'}

小结:

/**
 * Spring Boot 配置文件 使用application.properties
 * 测试类参考test目录下的PropertiesTest.java
 *一、自动配置
 *   Spring Boot 提供了对应用进行自动化配置。相比以前 XML 配置方式,很多显式方式申明是不需要的。二者,大多数默认的配置足够实现开发功能,从而更快速开发。
 *   什么是自动配置?
 *   Spring Boot 提供了默认的配置,如默认的 Bean ,去运行 Spring 应用。它是非侵入式的,只提供一个默认实现。
 *   大多数情况下,自动配置的 Bean 满足了现有的业务场景,不需要去覆盖。但如果自动配置做的不够好,需要覆盖配置。
 *   比如通过命令行动态指定某个 jar ,按不同环境启动。那怎么办?这里先要考虑到配置的优先级。
 *
 *   Spring Boot 不单单从 application.properties 获取配置,所以我们可以在程序中多种设置配置属性。按照以下列表的优先级排列:
 *  1.命令行参数
 *   2.java:comp/env 里的 JNDI 属性
 *   3.JVM 系统属性
 *   4.操作系统环境变量
 *   5.RandomValuePropertySource 属性类生成的 random.* 属性
 *   6.应用以外的 application.properties(或 yml)文件
 *    7.打包在应用内的 application.properties(或 yml)文件
 *    8.在应用 @Configuration 配置类中,用 @PropertySource 注解声明的属性文件
 *   9.SpringApplication.setDefaultProperties 声明的默认属性
 *
 *    可见,命令行参数优先级最高。这个可以根据这个优先级,可以在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。
 *   还有第 6 点,根据这个在多 moudle 的项目中,比如常见的项目分 api 、service、dao 等 moudles,往往会加一个 deploy moudle 去打包该业务各个子 moudle,
 *   应用以外的配置优先。
 *
 * 二.@ConfigurationProperties(prefix="home")
 *  通过 @ConfigurationProperties(prefix = “home”) 注解,将配置文件中以 home 前缀的属性值自动绑定到对应的字段中。
 *  同是用 @Component 作为 Bean 注入到 Spring 容器中。
 *
 *  注意:当reources中同时存在application.properties ,application.yml文件时,spring优先启动application.properties配置文件
 */

多环境配置
    很多场景的配置,比如数据库配置、Redis 配置、注册中心和日志配置等。在不同的环境,我们需要不同的包去运行项目。所以看项目结构,有两个环境的配置:
    application-dev.properties:开发环境
    application-prod.properties:生产环境

    Spring Boot 是通过 application.properties 文件中,设置 spring.profiles.active 属性,比如 ,配置了 dev ,则加载的是 application-dev.properties :
    # Spring Profiles Active
    spring.profiles.active=dev

    那运行PropertiesTest应用启动类,从控制台中可以看出,是加载了 application-dev.properties 的属性输出:
    HomeProperties{province='shang dong', city='wei fang', desc='[application-dev] i come from shang dong wei fang.'}
    将 spring.profiles.active 设置成 prod,重新运行,可得到 application-pro.properties的属性输出:
    HomeProperties{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}

    根据优先级,顺便介绍下 jar 运行的方式,通过设置 -Dspring.profiles.active=pro 去指定相应的配置:
    mvn package
    java -jar -Dspring.profiles.active=prod springboot-properties-0.0.1-SNAPSHOT.jar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值