我们正在使用从外部文件加载属性 @PropertySources
. 现在我想启用/禁用 @Aspect
基于财产。我试过用 @ConditionalOnExpression
但没用。我也尝试了同样的方法,创建了一个 propertyplaceholderconfig
. 即使在同样的情况下,它也不起作用。然后我试着 @profile
一开始也不管用。
我发现这些变量在启动时并没有初始化 propertysource
或者 propertyplaceholder
bean在启动时使用。一些变量总是被忽略,比如(logging.file)。但是 @Value
很好用。为了设置这些变量,我必须将它们作为jvm参数传递。
所以我的问题是:
1.如何使spring在启动时总是读取指定的属性文件并尊重它们?
2.启用/禁用的最佳方式是什么 @Aspect
. 使用 @profile
或者 @ConditionalOnExpression
或者别的什么?
目前,我们正在设置 logging.file
在main方法中,因为这也具有相同的行为方式。但你们知道这不是正确的方法,因为我可能会像这样一个接一个地添加属性。我想把所有的属性放到外部文件中,这样spring就可以读取这些文件并设置它的属性。
我们的物业结构:
common.properties#它具有所有公共属性
service.properties#特定于服务的属性。它还将包含将被覆盖的common.properties中的现有属性。
我知道我可以使用个人资料。但是,我们希望将属性保留在外部,以便在更改属性时需要重新启动服务。我也不想把变量作为jvm参数传递,所以我必须用这种方式传递大多数变量。传递-dspring.config.location也很困难,因为 common.properties
以及 service.properties
并且“service.properties”文件名因每个服务而异。
示例代码:
主要等级:
@PropertySources({
@PropertySource(value = "file:${property_path}/common.properties", ignoreResourceNotFound = false),
@PropertySource(value = "file:${property_path}/service1.properties", ignoreResourceNotFound = true) })
public class MainClass {
static String logDirectory = ApplicationContext.getGlobalProperty("logging.file");
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(MainClass.class);
Properties properties = new Properties();
properties.put("logging.file", logDirectory);
springApplication.setDefaultProperties(properties);
springApplication.run(args);
}
}
应用程序上下文:
@Configuration
@EnableAutoConfiguration
public class ApplicationContext implements EnvironmentAware {
private static Environment environment;
@Override
public void setEnvironment(Environment environment) {
ApplicationContext.environment = environment;
}
public static String getGlobalProperty(String propertyName) {
return environment.getProperty(propertyName);
}
}
在这里你可以看到我用过的任何方法 environment
得到 property
. 是否有任何方法可以使用环境设置属性,以便在spring引导初始化时填充属性?
我们也可以实施 ApplicationContextInitializer
和覆盖 initialize
方法读取属性。但如何使它读取2个属性文件并用最新的值重写重复的属性呢?参考(我不知道如何用这种方式实现我的需求)。即使在这种情况下,你听起来也不像是想用锤子杀死蚊子?
当前工作方案:
@Aspect
@Profile("!production")
@Configuration
public class ControllerAspect {
@pointcut(....)
} //Here also I've to pass spring.profiles.active as JVM params.
//setting the value in common.properties or service1.properties is not working.
我是一个新手到 Spring 开机,所以请让我知道更多的澄清。
1条答案
按热度按时间ubof19bj1#
spring似乎默认在初始化时加载一些属性,除非您专门编写了覆盖它们的逻辑(如我在中编写的)
MainClass.java
)没有替代这些的选项。其中一些包括(logging.file,在@conditionalonexpression中使用的键)。一些有自己挑战的技巧:
指定中的属性
application.properties
在你的类路径中。在早期阶段加载的变量总是从这个文件中读取。挑战:我已经将所有属性紧密耦合到jar中,为了更改值,我必须重新编译并重新启动jar。使用配置文件并定义
application.properties
作为application-profile.properties
. 挑战:我已经创建了这么多的配置文件,但仍然存在以前的挑战。将属性值作为jvm参数传递为
-Dproperty.key=value
. challenge:seriously? 我应该发送多少属性作为jvm参数?实施
ApplicationContextInitialize
和覆盖initialize
方法。challenge:overriding spring不建议使用的默认行为,而且仅用于读取属性文件不是一种过分的做法吗?解决方案:
使用
-Dspring.config.location
指定属性文件。在这种情况下,always spring只从指定的位置读取属性。也可以提供多个属性文件。有关更多详细信息,请参阅此。似乎如果您在目录Spring按相反顺序加载时指定属性位置。但如果指定文件,它将遵循指定的顺序。注:所有这些可以结合在一起。要了解这一点,请参阅。