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