spring引导属性将在初始化时加载,并根据属性文件中的值尊重all和control@aspect

0qx6xfy6  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(230)

我们正在使用从外部文件加载属性 @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 开机,所以请让我知道更多的澄清。

ubof19bj

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按相反顺序加载时指定属性位置。但如果指定文件,它将遵循指定的顺序。
注:所有这些可以结合在一起。要了解这一点,请参阅。

相关问题