经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
spring boot环境抽象的实现方法
来源:jb51  时间:2019/4/3 16:03:09  对本文有异议

在实际开发中,开发人员在编写springboot的时候通常要在本地环境测试然后再部署到Production环境,这两种环境一般来讲是不同的,最主要的区别就是数据源的不同。

在应用环境中,集成在容器的抽象环境模型有两个方面:profiles和properties。只有给出的profile被激活,一组逻辑命名的bean定义才会在容器中注册。

环境变量对象角色和profiles的关系来决定哪个profiles(如果有)处于当前激活状态,哪个profiles默认被激活。

@Profile

基于Java类的环境配置

@Profile注解可以用来标注@Configuration注解的类。表示该特定环境下激活该类下的所有bean。当然也可以专门用来标注@Bean,因为许多时候本地环境和Production环境的区别只是数据源不同罢了。

  1. @Configuration
  2. public class ProfileConf {
  3.  
  4.  
  5. @Bean
  6. @Profile("dev")
  7. public UserInfo devUserInfo() {
  8. UserInfo userInfo = new UserInfo();
  9. userInfo.setId(1);
  10. userInfo.setName("dev");
  11. return userInfo;
  12. }
  13.  
  14. @Bean
  15. @Profile("production")
  16. public UserInfo productionUserInfo() {
  17. UserInfo userInfo = new UserInfo();
  18. userInfo.setId(1);
  19. userInfo.setName("production");
  20. return userInfo;
  21. }
  22. }

激活profile

现在我们已经更新了我们的配置,我们仍然需要说明哪个profile是激活的。如果直接注册@Configuration标注的类,这将会看到一个NoSuchBeanDefinitionException被抛出,因为容器找不到一个对应的环境下的bean。

  1. public static void main(String[] args) {
  2. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
  3. context.getEnvironment().setActiveProfiles("dev");
  4. context.register(UserConf.class);
  5. context.refresh();
  6. System.out.println(context.getBean(UserInfo.class));
  7. }

默认的profile

默认配置文件表示默认启用的配置文件。

  1. @Bean
  2. @Profile("default")
  3. public UserInfo defaultUserInfo() {
  4. UserInfo userInfo = new UserInfo();
  5. userInfo.setId(1);
  6. userInfo.setName("default");
  7. return userInfo;
  8. }
  9.  

如果没有profile是激活状态,上面的bean将会被创建;这种方式可以被看做是对一个或者多个bean提供了一种默认的定义方式。如果启用任何的profile,那么默认的profile都不会被应用。

属性源抽象

Spring 环境抽象提供了可配置的属性源层次结构的搜索操作。

  1. public static void main(String[] args) {
  2. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
  3. // context.getEnvironment().setActiveProfiles("dev");
  4. context.getEnvironment().setActiveProfiles("dev");
  5. context.register(ProfileConf.class);
  6. context.refresh();
  7. ConfigurableEnvironment environment = context.getEnvironment();
  8. Map<String, Object> maps = environment.getSystemProperties();
  9. maps.keySet().forEach(k -> System.out.println(k + "->" + maps.get(k)));
  10.  
  11. System.out.println("===========================");
  12. Map<String, Object> environment1 = environment.getSystemEnvironment();
  13. environment1.keySet().forEach(k -> System.out.println(k + "->" + environment1.get(k)));
  14.  
  15. System.out.println(environment.containsProperty("java.vm.version"));
  16. }

在上面的例子中可以获取Environment的两个系统变量以及环境变量。

一个PropertySource是对任何key-value资源的简单抽象,并且Spring 的标准环境是由两个PropertySource配置的,一个表示一系列的JVM 系统属性(System.getProperties()),一个表示一系列的系统环境变量(System.getenv())。

具体的说,当使用StandardEnvironment时,如果在运行时系统属性或者环境变量中包括foo,那么调用env.containsProperty(“java.vm.version”)方法将会返回true。

更重要的是,整个机制都是可配置的。也许你有个自定义的属性来源,你想把它集成到这个搜索里面。这也没问题,只需简单的实现和实例化自己的PropertySource,并把它添加到当前环境的PropertySources集合中:

  1. ConfigurableApplicationContext ctx = new GenericApplicationContext();
  2. MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
  3. sources.addFirst(new MyPropertySource());

@PropertySource

上一篇文章讲到,基于Java的配置很多时候会和xml混合使用。其中@Import还可以导入其他Java配置类,这里要说的@PropertySource注解表示导入.properties文件。

  1. @Configuration
  2. @PropertySource("classpath:user.properties")
  3. public class UserConf {
  4.  
  5. @Autowired
  6. Environment environment;
  7.  
  8. @Bean
  9. //每次调用就创建一个新的bean
  10. @Scope("prototype")
  11. public UserInfo userInfo() {
  12. UserInfo userInfo = new UserInfo();
  13. userInfo.setId(Integer.valueOf(environment.getProperty("user.id")));
  14. System.out.println(environment.getProperty("user.name"));
  15. userInfo.setName(environment.getProperty("user.name"));
  16. return userInfo;
  17. }
  18. }
  1. user.id=11
  2. user.name=asdasd

任何出现在@PropertySource中的资源位置占位符都会被注册在环境变量中的资源解析。

假设”user.name”已经在其中的一个资源中被注册,例如:系统属性或环境变量,占位符将会被正确的值解析。

如果没有,”default/path”将会使用默认值。如果没有默认值,而且无法解释属性,则抛出IllegalArgumentException异常。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号