代码之家  ›  专栏  ›  技术社区  ›  simpleusr

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

  •  1
  • simpleusr  · 技术社区  · 7 年前

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

    我设法从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)是注册的。从cxf读取以下配置。我的应用程序中的路径=/api2。属性文件:

    2017-11-10 09:41:41.029信息7880---[ost-startStop-1]o.s.b.w.servlet。ServletRegistrationBean:将servlet:“CXFServlet”映射到[/api2/ ]*

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

    目前,我正在添加以下DependsOn注释到我的所有bean中,这是非常令人讨厌的。。。

     @DependsOn("propertiesConf")
    

    但我仍然对servlet等有问题。。

    正确的spring方法是什么

    1 回复  |  直到 7 年前
        1
  •  2
  •   Community CDub    4 年前

    可能您正在寻找 EnvironmentPostProcessor .

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

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