如何在Spring中检测未使用的属性

时间:2009-05-18 21:36:35

标签: java spring

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

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

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

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

是否有(简单)方法来获取PropertyPlaceholderConfigurer的属性?关于如何解决这个问题的任何其他建议?

编辑:解决方案正在访问mergeProperties metod,如下所示:

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之后,其余的很简单。减去两个集合,瞧:我们现在可以列出未使用的属性。

3 个答案:

答案 0 :(得分:3)

您可以尝试使用反射调用受保护的方法mergeProperties来获取完整的属性列表,然后,正如其他海报已经说过的那样,删除所有实际用于结束的属性未使用的属性集。

对于生产代码可能有些过于讨厌,但我假设您只在单元测试设置中运行此代码来生成此报告。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

难道你不能迭代使用过的属性列表并从一组重复的属性中删除它们吗?这会留下未使用的。