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

时间:2017-11-10 08:18:00

标签: java spring tomcat spring-boot spring-boot-starter

我在Spring启动应用程序中使用嵌入式tomcat。我的要求是从db和属性文件中读取所有配置属性。

我设法从db读取属性,并使用@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:&#39; CXFServlet&#39;至[/ api2 / ] *

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

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

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

 @DependsOn("propertiesConf")

但我仍然遇到servlet等问题。

执行此操作的正确弹簧方式是什么

2 个答案:

答案 0 :(得分:2)

可能您正在寻找EnvironmentPostProcessor

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

以下是帮助您入门的教程:https://blog.frankel.ch/another-post-processor-for-spring-boot/#gsc.tab=0

答案 1 :(得分:-1)

如果您想在应用程序启动后立即覆盖某些配置,我认为使用ApplicationListener是一种好方法。

您可以参考23.5 Application events and listeners来实现侦听ApplicationStartingEvent的侦听器。然后,您可以从数据库中读取这些配置,然后将它们分配给您的bean。

希望这能帮到你!