我正在尝试编写一个 Multi-Tenancy Spring Boot 应用程序,但在服务器启动时无法急切初始化 bean(即一旦租户请求 bean 就不会懒惰)
为了支持 Multi-Tenancy ,我创建了一个 @CustomerScoped
注释,它根据 ThreadLocal String 值创建对象。
我的配置提供了一个像这样的 bean 并延迟初始化它:
@Autowired
private AutowireCapableBeanFactory beanFactory;
@Bean
@CustomerScoped
public Scheduler getScheduler() {
CreateDefaults job = factory.createBean(CreateDefaults.class));
Scheduler scheduler = new Scheduler();
scheduler.schedule(job);
return scheduler;
}
@PostConstruct
public void init() {
CustomerScope.setCustomer("tenant1");
getScheduler();
CustomerScope.setCustomer("tenant2");
getScheduler();
CustomerScope.clearCustomer();
}
启动服务器时,应创建两个调度程序,每个调度程序将执行自己的“创建默认值”实例。 当租户自己访问应用程序时,他们应该获得自己的此调度程序实例。 这似乎可行,但我想知道这是否是正确的做事方式。 特别是,我担心 beanFactory 本身没有作用域。
这种方法是否适用于更复杂的系统?
最佳答案
我的代码示例实际上是正确的。 Beanfactory 本身不需要限定范围,它只需要知道范围,就我而言,这可以在配置中实现:
@Bean
public static CustomScopeConfigurer customScope() {
CustomScopeConfigurer configurer = new CustomScopeConfigurer();
configurer.addScope(CustomerScope.CUSTOMER_SCOPE_NAME, new CustomerScope());
return configurer;
}
关于java - 我如何急切地为每个租户初始化 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37205094/