2016-05-13 19 views
2

我想写一个多租户春季启动应用程序,但其在服务器启动时(即不是懒洋洋地,一旦承租人请求豆)我如何热切地为每个租户初始化bean?

,支持多租户,我创建了一个麻烦,渴望初始化豆@CustomerScoped基于ThreadLocal字符串值创建对象的注释。

我的配置提供了这样一个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本身没有作用域。

此方法适用于更复杂的系统吗?

+1

工厂并不需要先限定,它只需要知道现有的范围,以便它可以将bean的存储/检索委托给范围。 – zapl

+0

我如何让工厂意识到范围?这是否足以在我的配置中? '@Bean public static CustomScopeConfigurer customScope(){ CustomScopeConfigurer configurer = new CustomScopeConfigurer(); configurer.addScope(CustomerScope.CUSTOMER_SCOPE_NAME,new CustomerScope()); return configurer; }' –

+0

是的,应该是这样。配置器是一个*“简单的'BeanFactoryPostProcessor'实现,它向包含'ConfigurableBeanFactory'的注册自定义'Scope's。”* - 在spring-boot中'AutowireCapableBeanFactory' – zapl

回答

1

我的代码示例实际上是正确的。 BeanFactory中并不需要先限定本身,它只是必须意识到范围,这在我的情况下,可以在配置来实现的:

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