我有一个spring bean,它根据可用性加载属性文件,如下所示: -
Route::resource('profile', 'ProfileController')->middleware('usercanviewprofile');
属性文件正在加载,但当我尝试通过以下方式读取整个属性文件时: -
@PropertySources({ @PropertySource(value = "classpath:user.properties"),
@PropertySource(value = "file:./config/user.properties", ignoreResourceNotFound = true) })
然后我只从classpath获取属性。弹簧是否提供了一次性读取所有属性的机制?
答案 0 :(得分:1)
你的代码并没有做注释所做的事情。你有几个注释声明要做什么。该逻辑并未在代码段中显示 。
没有魔力,如果你想要相同的结果,你需要在代码中翻译那些注释的声明方面(即读取类路径文件然后读取文件一并检查它是否存在然后合并这些属性)。
如果你可以获得额外的密钥,你也可以简单地注入Environment
,因为@PropertySource
将要更新。
答案 1 :(得分:0)
回答我自己的问题,这可能对某人有所帮助。 由于我需要使用外部属性文件(如果存在于指定文件夹中)覆盖jar中包含的属性文件,我还需要一次性读取整个属性文件。 我已经利用加载最后一个属性读取的弹簧行为。
@PropertySources({ @PropertySource(value = "classpath:application.properties"),
@PropertySource(value = "file:./config/application.properties", ignoreResourceNotFound = true) })
现在,如果./config/位置中存在application.properties,那么它将覆盖classpath中的application.properties。
在主要的application.properties中,我已经定义了外部属性应该加载的位置,即
config.location=./config/
在生产和测试环境中,可以覆盖./ config / 属性。
在此之后,我已经定义了一个bean来加载所有属性文件(跳过import语句): -
@Component
public class PropertiesConfig {
private final Logger logger = LoggerFactory.getLogger(PropertiesConfig.class);
private final String[] PROPERTIES_FILENAMES = { "prop1.properties", "prop2.properties",
"prop3.properties" };
private String configLocation;
private Map<String, Properties> configProperties;
@Autowired
public PropertiesConfig(@Value("${config.location}") String configLocation) {
this.configLocation = configLocation;
configProperties = Arrays.stream(PROPERTIES_FILENAMES)
.collect(Collectors.toMap(filename -> filename, this::loadProperties));
}
public Properties getProperties(String fileName) {
if (StringUtils.isEmpty(fileName) || !configProperties.containsKey(fileName)) {
logger.info(String.format("Invalid property name : %s", fileName));
throw new IllegalArgumentException(
String.format("Invalid property name : %s", fileName));
}
return configProperties.get(fileName);
}
private Properties loadProperties(final String filename) {
final Resource[] possiblePropertiesResources = { new ClassPathResource(filename),
new PathResource(getCustomPath(filename)) };
final Resource resource = Arrays.stream(possiblePropertiesResources)
.filter(Resource::exists).reduce((previous, current) -> current).get();
final Properties properties = new Properties();
try {
properties.load(resource.getInputStream());
} catch (final IOException exception) {
throw new RuntimeException(exception);
}
logger.info("Using {} as user resource", resource);
return properties;
}
private String getCustomPath(final String filename) {
return configLocation.endsWith(".properties") ? configLocation : configLocation + filename;
}
}
现在你有一个包含map中所有属性文件的bean,可以在任何bean中注入,并且可以覆盖任何环境。