接上篇《SpringBoot实战7-Spring基础-Bean的生命周期》的学习,本文学习Spring的一个重要的概念Environment-应用环境。

2.7 应用环境 - Environment

Spring为我们提供了一个接口Environment用来代表当前运行应用的环境,这个环境包含两个部分:

  • Profile:指的是一组命名的、定义在一起的Bean。我们通常为不同的应用场景(生产、开发,测试等)定义。
  • Property:指的是配置属性,我们可以从properties文件、JVM系统属性、操作系统环境变量等外部来获得配置属性。

2.7.1 场景 - @Profile

我们可以通过@Profile注解指定当前的运行场景,@Profile可以和@Component等、@Configuration和@Bean一起使用,当然也分别限制了@Profile起效的Bean的分组。

下面使用需要显示不同操作系统的列表命令的Bean:

public class CommandService {    private String listCommand;    public CommandService(String listCommand) {        this.listCommand = listCommand;    }    public void list(){        System.out.println("当前系统下列表命令是:" + listCommand);    }}

在开发环境Windows下的配置为:

@Configuration@Profile("dev")public class WindowsProfileConfig {    @Bean    CommandService commandService(){        return new CommandService("dir");    }}

在生产环境Linux下的配置为:

@Configuration@Profile("production")public class LinuxProfileConfig {    @Bean    CommandService commandService(){        return new CommandService("ls");    }}

当我们配置好了两种不同场景下的Profile,我们需要在应用中配置哪个是激活的Profile,手动配置应该是像下面这样:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.getEnvironment().setActiveProfiles("production"); context.scan("top.wisely");context.refresh();

但我们使用了Spring Boot,我们只需在application.properties文件配置:

spring.profiles.active=production

我们在JavaConfig里用CommandLineRunner分别运行将Profile置成production和dev:

@BeanCommandLineRunner profileClr(CommandService commandService){   return args -> commandService.list();}

2.7.2 属性配置 - @PropertySource

Spring的Environment的属性是由PropertySource组成的,我们可以通过@PropertySource指定外部配置文件的路径,这些配置文件的属性都会以PropertySource的形式注册到Environment中,@PropertySource支持xml和properties格式,不支持Spring Boot下的YAML格式。

如我们现在添加了2个外部配置文件:

  • author.properties
author.name=wyf
  • book.properties
book.name=spring boot in battle

我们可以用一个配置类来接受这两个文件的配置:

@Configuration@PropertySources({        @PropertySource("classpath:author.properties"),        @PropertySource("classpath:book.properties")}) //1public class ExternalConfig {    Environment env;    public ExternalConfig(Environment env) { //2        this.env = env;    }    @Value("${book.name}") //3    private String bookName;    public void showEnv(){        System.out.println("作者名字是:" + env.getProperty("author.name")); //4        System.out.println("书籍名称是:" + bookName);    }}
  1. 多个外部配置可以用@PropertySources,若只有一个可以只使用@PropertySource("classpath:book.properties");
  2. 注入Environment的Bean,因只有一个参数,可省略@Autowired;
  3. 可以@Value注解获得Environment中的属性,@Value的使用在Spring EL一节有更详细的讲解;
  4. 外部配置的属性都已经在Environment注册,可以直接获取。

下一篇《SpringBoot实战9-Spring基础-条件配置@Conditional》

spring environment_SpringBoot实战8-Spring基础-应用环境相关推荐

  1. Spring Security 实战:Spring Boot 下的自动配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1. 前言 我们在前几篇 ...

  2. 【struts2+hibernate+spring项目实战】Spring计时器任务 Spring整合JavaMail(邮件发送)(ssh)

    一.常用数据频度维护 对于系统使用度较高的数据,客户在查看时希望这些数据最好先出现,此时需要为其添加排序规则.在进行排序时,使用次数成为排序的依据.因此需要设置一个字段用来描述某种数据的使用次数,也就 ...

  3. Spring Security 实战干货: RBAC权限控制概念的理解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...

  4. Spring Security 实战:使用 JWT 认证访问接口

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 欢迎阅读Spring Security 实战 ...

  5. Spring Security 实战:基于配置的接口角色访问控制

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...

  6. Spring Security 实战:自定义异常处理

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 最近实在比较忙,很难抽出时间来继续更  [S ...

  7. Spring Security 实战干货:玩转自定义登录

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 前面的关于 Spring Security  ...

  8. Spring Boot实战pdf

    下载地址:网盘下载 Spring Boot实战以Spring应用程序开发为中心,全面讲解如何运用Spring Boot提高效率,使应用程序的开发和管理更加轻松有趣.作者行文亲切流畅,以大量示例讲解了S ...

  9. 【Spring Boot实战】源码解析Spring Boot自动配置原理

    一.简介 Spring致力于让Java开发更简单,SpringBoot致力于让使用Spring进行Java开发更简单,SpringCloud致力于基于SpringBoot构建微服务生态圈,让微服务开发 ...

最新文章

  1. EasyUI——常见用法总结
  2. jQuery的DOM操作之取值/赋值(1)
  3. 一串事物中每个事物的前后位置与顺序编号的转换问题
  4. 计算机语言平均数怎么算,使用python怎么求三个数的平均值
  5. django 修改html无变化,Django Pycharm 修改html后立即刷新页面
  6. C#调用Server_SQL
  7. Obez'yanka-Nol
  8. angularjs实际工程目录结构
  9. LINUX下载编译libtheora
  10. lopatkin俄大神最新精简中文系统Windows 7 Professional VL SP1 7601.24496 x86-x64 ZH-CN DREY
  11. 计算机学科评估b是水平,学科评估B什么水平?
  12. Date Wed Mar 17 2021 13:52:00 GMT+0800 (中国标准时间) 转标准的日期格式
  13. 第一次OllyDbg逆向记录(分析思路和注意点其他文章)
  14. python列表的“增删改查”(python基础讲解第四天)
  15. 两台计算机上用网线共享打印机共享,怎么将打印机共享两台计算机用一根网线,其中一台有打...
  16. 新浪微博PC客户端(DotNet WinForm版)——功能实现分解介绍
  17. 1.2 SpringBoot构建Docker镜像并推送到Harbor
  18. 2019.12.31罗振宇2020年跨年演讲《时间的朋友》精华全文版本——思维决定一个人的上限,能力决定一个人的下限
  19. 小程序订阅消息流程及案例
  20. 力扣第314周赛第三题

热门文章

  1. leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer
  2. 派生类中构造函数与虚构函数的研究
  3. 一个基于xml的超级orm框架-世界是由懒人创造的。
  4. 动态加载JS脚本的4种方法
  5. JavaScript事件绑定的方法说明 收藏
  6. go语言游戏编程-Ebiten渲染一张图片
  7. redis 安装测试
  8. phonegap在android中如何退出程序
  9. 队列的C语言实现(通过内核链表)
  10. 关于汇编跟C/C++已经java的内存理解