【问题标题】:How to detect unused properties in Spring如何在 Spring 中检测未使用的属性
【发布时间】:2010-10-27 04:03:49
【问题描述】:

我正在开发一个没有注释的 Spring 2.0 项目。我们使用几个带有不同前缀和后缀的 PropertyPlaceholderConfigurer bean 来从不同的属性文件加载属性。这很好用。

由于大量的属性文件和属性,我希望应用程序列出未使用的属性。这意味着,在属性文件中配置的属性,但从未在 Spring 应用程序上下文中引用。

我编写了一个实现 BeanFactoryPostProcessor 的 bean,并做了一些技巧来在应用程序上下文中找到对不同 PropertyPlaceHolderConfigurers 的引用。这给了我一个使用的属性列表。

但是,我无法访问 PlaceHolderConfigurers 加载的属性。因此,我无法显示未使用的属性。

是否有一种(简单的)方法可以获取 PropertyPlaceholderConfigurer 的属性?有关如何解决此问题的任何其他建议?

编辑:解决方案是访问 mergeProperties 方法,如下所示:

PropertyPlaceholderConfigurer ppc = 
    (PropertyPlaceholderConfigurer) applicationContext.getBean("yourBeanId");
Method m = PropertiesLoaderSupport.class.getDeclaredMethod("mergeProperties", 
            new Class[] {});
m.setAccessible(true);
Properties loadedProperties = (Properties) m.invoke(propertyPlaceHolder, null);

在获得最初加载的属性,并在 BeanFactoryPostProcessing 期间获取 beandefinitions 之后,剩下的就很简单了。减去这两个集合,瞧:我们现在可以列出未使用的属性。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    如何创建您自己的 PropertyPlaceholderConfigurer 子类,该子类将保留对其 Properties 对象的引用并提供访问器。然后,您的 BeanFactoryPostProcessor 将能够访问每个原始 Properties 对象,并结合使用的属性列表,您可以找出未使用的属性。

    【讨论】:

    • 这将需要编辑所有 PropertyPlaceHolderConfigurers,这是可能的,但我不想这样做。通过使用上面的解决方案,我还可以检测到由“新人”添加的新 PropertyPlaceHolderConfigurers 中缺少的属性:-)
    【解决方案2】:

    您不能只遍历已使用属性的列表并将它们从所有属性的重复集中删除吗?这将留下未使用的。

    【讨论】:

    • 所用属性没有getter,所有属性也没有getter。
    【解决方案3】:

    您可以尝试使用反射调用受保护的方法mergeProperties 以获取完整的属性列表,然后,正如其他发帖人已经说过的那样,删除所有实际使用的属性,最终以未使用的属性。

    对于生产代码来说可能有点太老套了,但我假设您只会在单元测试设置中运行它以生成此报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2022-12-19
      相关资源
      最近更新 更多