我正在尝试编写一个多租户Spring Boot应用程序,但是在服务器启动时急于初始化bean(即一旦租户请求bean,就不会懒惰)
为了支持多租户,我创建了一个@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();
}
启动服务器时,应创建两个Scheduler,每个Scheduler都会执行自己的“Create Defaults”实例。 当租户自己访问应用程序时,他们应该获得自己的调度程序实例。 这似乎有效,但我想知道这是否是正确的做事方式。 特别是,我担心beanFactory本身没有范围。
这种方法是否适用于更复杂的系统?
答案 0 :(得分:1)
我的代码示例实际上是正确的。 Beanfactory不需要自己限定范围,只需要知道范围,在我的情况下可以在配置中实现:
@Bean
public static CustomScopeConfigurer customScope() {
CustomScopeConfigurer configurer = new CustomScopeConfigurer();
configurer.addScope(CustomerScope.CUSTOMER_SCOPE_NAME, new CustomerScope());
return configurer;
}