Spring外部化配置的几种技巧分享

Spring外部化配置的几种技巧分享

正文

Envrionment 获取外部配置

@Log4j2
@SpringBootApplication
public class ConfigurationApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigurationApplication.class, args);
    }
    @Bean
    ApplicationRunner applicationRunner(Environment environment){

        return  args -> {
            log.info("user.name : {}",environment.getProperty("user.name"));
        };
    }
}

修改Spring默认配置文件名称

启动程序参数中加入如下配置:

--spring.config.name=app

Value注解配置来源

配置文件

@Bean
ApplicationRunner applicationRunner(Environment environment,
                           @Value("${greeting.message:hello boy}") String message){

   return  args -> {
      log.info("from application.properties user.name : {}",environment.getProperty("user.name"));
      log.info("from application.properties greeting.message : {}",message);

   };
}

默认值

value注解通过冒号来配置默认值:

@Value("${greeting.message:hello boy}")

获取环境变量值

获取程序参数值

外部化配置文件优先级问题

如果有application.properties在springboot 启动jar包同一目录,会优先读取这个文件中的配置。

Autowire注入ConfigurableEnvrionment

public static void main(String[] args) {

        new SpringApplicationBuilder()
                .sources(ConfigurationApplication.class)
                .run(args);
}

@Autowired
void getConfigurableEnvrionment(ConfigurableEnvironment environment) {
    environment.getPropertySources().addLast(new MyPropertySource());
}

ApplicationInitialiazer 配置

    public static void main(String[] args) {

        new SpringApplicationBuilder()
                .sources(ConfigurationApplication.class)
                .initializers(applicationContext ->
                 applicationContext.getEnvironment().getPropertySources().addLast(new MyPropertySource()))
                .run(args);
    }

static  class  MyPropertySource extends PropertySource<String>{


   public MyPropertySource() {
      super("myproperty");
   }

   @Override
   public Object getProperty(String name) {

      if(name.equalsIgnoreCase("author-name")){
         return  "john";
      }
      return null;
   }
}

然后通过@Value注解注入获取author-name:

    @Bean
    ApplicationRunner applicationRunner(Environment environment,
                                        @Value("${greeting.message:hello boy}") String message,
                                        @Value("${author-name}") String name){

        return  args -> {
            log.info("from application.properties user.name : {}",environment.getProperty("user.name"));
            log.info("from application.properties author.name : {}",name);
        };
    }

总结

Spring的Environment抽象有很多值得学习的地方,期待下一期每日小技巧。

以上就是Spring外部化配置的几种技巧分享的详细内容,更多关于Spring外部化配置的资料请关注云海天教程其它相关文章!