【问题标题】:adding property sources in configuration classes在配置类中添加属性源
【发布时间】:2013-11-14 18:32:02
【问题描述】:

我必须加载一个属性文件,它的路径是在运行时确定的,同时还要弄清楚属性文件的格式。这意味着我不能只指定位置。我有一个属性加载器类,它读取文件并转换为键值对。过去我会通过实现 ApplicationContextInitializer 来做到这一点,但在这个应用程序中,我使用的是配置类,并且没有 web.xml 文件来注册这个监听器。我如何利用 @EnableWebMvc 配置类的启动过程来调用我的属性加载器类并将从它返回的地图添加为属性源。 任何帮助将不胜感激。

【问题讨论】:

    标签: spring spring-mvc spring-profiles


    【解决方案1】:

    要将ApplicationContextListener 挂接到 Servlet 3.0 环境中,您可以通过以下两种方式之一进行:

    • 包括定义contextInitializerClasses context-param 的web.xml 或web-fragment.xml,其值是实现的类名。您可以在 Web 应用程序中同时拥有注释和其中一个/两个部署描述符(XML 文件的优先级高于带注释的类)
    • 从实现WebApplicationInitializer的类中调用ServletContext类上的setInitParameter("contextInitializerClasses", MyImplementingInitializer.class.getName())方法,用@Order(1)注释该类以确保它在其他WebApplicationInitializers之前运行

    【讨论】:

    • 我想我还需要实现 ApplicationContextInitializer 才能访问 ConfigurableWebApplicationContext 以添加属性源。我如何在没有 web.xml 的情况下注册此侦听器
    • 为什么不能通过定义 @Configuration 类来添加定义,并在覆盖 getRootConfigClasses() 时指定该类?为什么特别需要使用 ApplicationContextInitializer?
    • 好的,我要做的就是在启动时加载一个管道分隔形式的文件。我需要读取文件并将管道分隔的数据转换为地图,然后将该地图加载为另一个 PopertySource。我过去做过的一种方法是在 webxml 中注册 ApplicationContextInitializer ,然后因为在这个类中我可以访问上下文和环境,所以我能够加载这些属性 .. 我需要做的就是在访问启动过程的同时进入applicationContext 和 environmetn 对象添加属性源
    • 啊,好的。我没有意识到 ApplicationContextListener 与 servlet 上下文参数如此紧密地联系在一起,而您所做的实际上是 ApplicationContext(不是 BeanFactory)特定的。我已经更新了我的答案。
    • 还不清楚。我已经在我的类中注册了我假设的调度程序 servlet,该类通过调用 configurer.enable 在 configureDefaultServletHandling 覆盖方法中扩展了 WebMvcConfigurerAdapter。所以现在你的建议是我创建另一个实现 WEbApplicationInitializer 的类并在那里创建调度程序 servlet .. WebMvcConfigurerAdapter 类会发生什么。所有这些数百万种设置方式都变得非常混乱。感谢您迄今为止的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2018-11-08
    相关资源
    最近更新 更多