java - 我如何急切地为每个租户初始化 bean?

标签 java spring spring-boot

我正在尝试编写一个 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/

相关文章:

java - Eclipse:有没有办法在 Organize Import 中强制导入以解决歧义?

java - 转到最后滚动的位置 java swing JScrollPane

java - 如何在同一个项目中以不同方式配置两个rabbitlistener?

java - Thymeleaf + Bootstrap 配置

spring - hibernate - 如果父级设置了级联,则无法删除子级

java - spring mvc javascript/css 位置

java - 在 Java 中是否可以覆盖 Objects 数组的 'toString'?

spring - 任何现有的方法来确保在 spring xml 中定义的 beans 是无状态的?

java - Maven 如何在 Spring 教程中帮助我

java - Spring Boot Rest 服务表格太大