Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 配置文件可以在运行时动态交换吗?_Spring Boot - Fatal编程技术网

Spring boot 配置文件可以在运行时动态交换吗?

Spring boot 配置文件可以在运行时动态交换吗?,spring-boot,Spring Boot,我正在更新一个遗留的web应用程序。这个应用程序的难点之一是配置模型。目前,每个客户都有一个单独的应用程序实例,每个实例都有单独的配置属性。这些属性当前存储在Tomcat的context.xml中,并且有一个JNDI助手在启动时提取这些属性。因为一个Tomcat实例=一个context.xml,所以这是可行的。但现在我们希望所有客户都有一个实例或实例集群 我认为这通常会在会议期间完成。但在本例中,这将是一个大型重构。配置值保存在带有静态setter和getter的pojo中,在整个代码库中大量调

我正在更新一个遗留的web应用程序。这个应用程序的难点之一是配置模型。目前,每个客户都有一个单独的应用程序实例,每个实例都有单独的配置属性。这些属性当前存储在Tomcat的context.xml中,并且有一个JNDI助手在启动时提取这些属性。因为一个Tomcat实例=一个context.xml,所以这是可行的。但现在我们希望所有客户都有一个实例或实例集群

我认为这通常会在会议期间完成。但在本例中,这将是一个大型重构。配置值保存在带有静态setter和getter的pojo中,在整个代码库中大量调用这些setter和getter。JNDI助手在启动时在pojo上设置配置,这就是应用程序查找其配置值的方式

我们在开发过程中采取了一些小步骤来改进这个模型,而不是进行大的重构。因此,我们的目标是在朝着好的方向前进的同时,尽可能少地改变。我考虑的一件事是使用Spring引导配置文件。每个客户可以有一个spring引导配置文件,而不是每个客户一个单独的实例。然后,在每次HTTP请求时,servlet过滤器都可以通过观察用户是谁来激活相应的配置文件,并在请求期间激活他们的配置文件,我希望这样就可以将值从过滤器注入到静态setter中

我知道这是不正常的,但我试着跳出框框思考

我知道ConfigurableEnvironment.setActiveProfiles。我不确定的是,这是否会在引导阶段后主动注入属性值更改,以及这是否可能导致性能问题或出于任何其他原因听起来很疯狂。

来自Spring:

您可以通过调用SpringApplication.setAdditionalProfiles以编程方式设置活动配置文件…​ 在应用程序运行之前。还可以使用Spring的ConfigurableEnvironment界面激活配置文件


这与spring配置文件无关!您可以通过编程方式对它们进行操作,但在JVM应用程序中有一个spring上下文。 您想使用用户特定的属性进行操作,是吗?这是每个请求,或者更确切地说是每个会话范围,而不是应用程序范围! 我建议您使用以下场景:

一,。对客户进行身份验证后,将其值存储在CustomerConfig实例中(非静态)!,并将此customerConfig存储到请求或会话属性

二,。您可以在HttpFilter中执行此操作:

if (session.isNew)
{   // read customerConfig from DB or resources etc...
    session.setAttribute("customerConfig",customerConfig);
}
三,。在POJO课程中,您可以像

ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
CustomerConfig cc =(CustomerConfig)attr.getRequest().getSession().getAttribute("customerConfig");
parameter = cc.getYourCustomerProperty();
四,。在组件、服务等中,您可以自动连接请求,如:

@Component
@Scope("request")
public class FooBar {
    @Autowired 
    private HttpServletRequest request;

    public void function()
    { CustomerConfig config = request().getSession().getAttribute("customerConfig");
      parameter = cc.getYourCustomerProperty();
      //...
     }  
}

听起来不错,谢谢。RequestContextHolder正是我需要的。