springboot 如何在启动的jar文件外加载配置文件或者启用配置参数

2022-04-05
1分钟阅读时长

springboot 如何在springboot启动的jar文件外,加载配置文件或者启用配置参数

一. 加载的配置文件顺序

  1. /config 当前目录的/config目录下
  2. 当前目录
  3. classpath下的config目录
  4. classpath的根目录

二. jar文件外加载配置文件

  1. 通过环境变量 SPRING_APPLICATION_JSON='{“server”:{“port”:“8080”}}'

  2. spring.location.config指定application.properties加载目录

  3. 通过命令行参数指定具体的变量的值 –params server.port=8080 -Dserver.port=8080

  4. 配置文件提供随机值和uuid的生成

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

注入变量

@Service public class UserService { private final String svnUrl;

@Autowired
public UserService(@Value("${SVN_URL}") String svnUrl) {
    this.svnUrl = svnUrl;
}

}

//静态注入
@Service
public class UserService {

    private static String SVN_URL;

    @Value("${SVN_URL}")
    public void setSvnUrl(String svnUrl) {
        SVN_URL = svnUrl;
    }

}

动态注册bean

@Configuration
public class DynamicBeansConfiguration {

    @Bean
    public BeanDefinitionRegistrar beanDefinitionRegistrar(Environment environment) {
        return new BeanDefinitionRegistrar(environment);
    }

    public class BeanDefinitionRegistrar implements BeanDefinitionRegistryPostProcessor {
        private Environment environment;

        public BeanDefinitionRegistrar(Environment environment) {
            this.environment = environment;
        }

        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

            List<Developer> developers = Binder.get(environment)
                    .bind("developers", Bindable.listOf(Developer.class))
                    .orElseThrow(IllegalStateException::new);

            developers.forEach(developer -> {
                GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
                beanDefinition.setBeanClass(Developer.class);
                beanDefinition.setInstanceSupplier(() -> new Developer(developer.getName()));
                registry.registerBeanDefinition(developer.getName(), beanDefinition);
            });
        }

        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        }
    }
}