我如何热切地初始化每个租户的bean?

时间:2016-05-13 08:32:06

标签: java spring spring-boot

我正在尝试编写一个多租户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本身没有范围。

这种方法是否适用于更复杂的系统?

1 个答案:

答案 0 :(得分:1)

我的代码示例实际上是正确的。 Beanfactory不需要自己限定范围,只需要知道范围,在我的情况下可以在配置中实现:

@Bean 
public static CustomScopeConfigurer customScope() {
    CustomScopeConfigurer configurer = new CustomScopeConfigurer();
    configurer.addScope(CustomerScope.CUSTOMER_SCOPE_NAME, new CustomerScope()); 
    return configurer;
}