我正在更新一个遗留的web应用程序。这个应用程序的一个困难之处是配置模型。目前,每个客户都有一个应用程序的单独实例,每个实例都有不同的配置属性。这些属性目前存储在Tomcat的context.xml中,在启动时有一个JNDI助手来提取这些属性。因为一个Tomcat实例=一个context.xml,所以这是可行的。但是现在我们希望为所有客户提供一个实例(或一组实例)。
我认为正常情况下,这将在本届会议上进行。但在这种情况下,这将是一个巨大的重构。配置值保存在带有静态设置器和getter的pojo中,它们在整个代码库中被频繁调用。JNDI助手在启动时在pojo上设置配置,这就是应用程序查找其配置值的方式。
我们正在采取婴儿的步骤,同时发展,以改进这一模式,而不是做一个大的重构。因此,我们的目标是在朝着一个好的方向前进的同时,尽可能少地改变。我正在考虑的事情之一是使用Spring配置文件。而不是每个客户一个单独的实例,每个客户可以有一个spring启动配置文件。然后,对于每个HTTP请求,servlet过滤器可以通过观察用户是谁来激活适当的配置文件,并在请求期间激活他们的配置文件,我希望这样就能够从过滤器将值注入静态设置器。
我知道这很不正常,但我想跳出框框去思考。
我知道ConfigurableEnvironment.setActiveProfiles的事。我不确定的是,这是否会在引导阶段之后主动注入属性值更改,以及这是否可能导致性能问题,或者出于任何其他原因听起来很疯狂。
发布于 2019-04-18 22:11:54
这与弹簧配置文件无关!您可以编程地操作它们,但在JVM (应用程序)中有一个spring上下文。您想使用特定于用户的属性操作,不是吗?这是每个请求,或者更确切地说是每个会话范围,而不是应用程序范围!我建议你采取以下设想:
1.)对客户进行身份验证后,将其值存储在CustomerConfig实例中(而不是静态的!),并将此customerConfig存储到请求或会话属性中。
2.)您可以在HttpFilter中这样做:
if (session.isNew)
{ // read customerConfig from DB or resources etc...
session.setAttribute("customerConfig",customerConfig);
}3.)在POJO类中,您可以像
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
CustomerConfig cc =(CustomerConfig)attr.getRequest().getSession().getAttribute("customerConfig");
parameter = cc.getYourCustomerProperty();4.)在您的组件、服务等中,您可以自动处理以下请求:
@Component
@Scope("request")
public class FooBar {
@Autowired
private HttpServletRequest request;
public void function()
{ CustomerConfig config = request().getSession().getAttribute("customerConfig");
parameter = cc.getYourCustomerProperty();
//...
}
}发布于 2019-04-18 20:05:01
来自春季文档
在应用程序运行之前,可以通过调用
SpringApplication.setAdditionalProfiles(…)以编程方式设置活动配置文件。还可以使用Spring的ConfigurableEnvironment接口激活概要文件。
https://stackoverflow.com/questions/55752559
复制相似问题