使用Spring以编程方式访问属性文件?
在使用Spring时,有时我们需要以编程的方式访问属性文件。一个常见的需求是从代码中访问占位符的值。可以通过注解来实现这个目标。例如,在代码中可以使用@Value
注解来访问占位符的值:@Value("${settings.some.property}") String someValue;
。另外,可以使用SPEL语法来从属性文件中获取占位符的值:#('${settings.some.property}')
。
然而,有时候我们需要将配置暴露给没有启用SPEL的视图。这时可以使用一个名为PropertyPlaceholderExposer
的类来实现。该类实现了Map
接口,并且实现了BeanFactoryAware
接口。通过调用beanFactory.resolveEmbeddedValue
方法,可以解析占位符的值。该类的实例可以通过<bean>
标签配置到Spring容器中,并在视图中使用${config['settings.some.property']}
来访问暴露的属性值。
如果需要获取所有占位符属性及其值,并确保占位符在属性值中正常工作,可以使用StringValueResolver
类。可以通过继承PropertyPlaceholderConfigurer
类并实现Map
接口来实现。在doProcessProperties
方法中,可以通过调用valueResolver.resolveStringValue
方法来解析属性值中的占位符。该类的实例可以配置到Spring容器中,并像上述方法一样访问属性值。
最后,有人问是否可以在使用final字段时实现这些功能。回答是不能直接注入到final字段中,但可以在构造函数中设置final字段的值。具体做法可以参考给出的链接。
至于使用SPEL语法时出现的错误'Invalid collection name: #('${producer.mongodb.collection}')'
,可以尝试将注解中的占位符语法更改为(collection = "${producer.mongodb.collection}")
。这样可能能够解决问题。
在Spring中如何以编程方式访问属性文件?
在Spring中,可以使用PropertiesLoaderUtils类来以编程方式访问属性文件。以下是一个示例代码:
Resource resource = new ClassPathResource("/my.properties"); Properties props = PropertiesLoaderUtils.loadProperties(resource);
这段代码通过ClassPathResource类创建了一个指向属性文件(my.properties)的资源对象,并使用PropertiesLoaderUtils类的loadProperties方法加载了该属性文件,并将其存储在一个Properties对象中。
这种方法与其他方法有什么不同呢?为什么有人选择这种方法并给了它两个额外的投票?
对于这个问题,某些情况下了另一种方法,即使用PropertyPlaceholderConfigurer。但是,有人认为这种方法对于这个任务来说有点过于复杂了。
还有一个问题是,如果属性文件位于外部目录(例如config文件夹)中,应该如何设置路径?
对于这个问题,有人建议使用FileSystemResource类,并提供属性文件的完整路径作为参数。
以上就是关于以编程方式在Spring中访问属性文件的问题的原因和解决方法的整理。