Spring boot starter web - 创建一个配置 bean 来改变首先初始化的属性

Spring boot starter web - make a configuration bean that alters properties initialized first

我在 spring 引导应用程序中使用嵌入式 tomcat。我的要求是从数据库以及 属性 文件中读取所有配置属性。

我设法从数据库中读取属性并将属性附加到带有 @Configuration bean 的 MutablePropertySources,如下所示:

@Configuration
public class PropertiesConf {

    @Autowired
    private Environment        env;

    @Autowired
    private ApplicationContext appContext;

    @PostConstruct
    public void init() {
        MutablePropertySources propertySources = ((ConfigurableEnvironment) env).getPropertySources();
        ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();

        DataSource ds = (DataSource) appContext.getBean("confDBBeanName");
        JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);

        //read config elements from db
        //List<IntegraProperties> list = ..

        list.forEach(entry -> map.put(entry.getKey(), entry.getValue()));
        MapPropertySource source = new MapPropertySource("custom", map);
        propertySources.addFirst(source);
    }

}

问题是此配置在 servlet(例如 cxf servlet)注册后初始化。以下配置是从我的 application.properties 文件的 cxf.path=/api2 中读取的:

2017-11-10 09:41:41.029 INFO 7880 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean:映射 servlet:'CXFServlet' 到 [ /api2/]*

如您所见,当我添加配置属性时,为时已晚。在我添加配置之前会进行一些初始化。

如何确保我的 bean (PropertiesConf) 在启动期间首先初始化并更改属性,以便它们在系统范围内适用于所有 bean?

目前我正在向我所有的 bean 添加以下 DependsOn 注释,这非常讨厌...

 @DependsOn("propertiesConf")

但我仍然对 servlet 等有疑问。

正确的spring方法是什么

可能您正在寻找 EnvironmentPostProcessor

它可以在启动应用程序上下文之前更改环境,我相信这是最清晰的方法。

这里有一个教程可以帮助您入门:https://blog.frankel.ch/another-post-processor-for-spring-boot/#gsc.tab=0