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本身没有作用域。
此方法适用于更复杂的系统吗?
工厂并不需要先限定,它只需要知道现有的范围,以便它可以将bean的存储/检索委托给范围。 – zapl
我如何让工厂意识到范围?这是否足以在我的配置中? '@Bean public static CustomScopeConfigurer customScope(){ CustomScopeConfigurer configurer = new CustomScopeConfigurer(); configurer.addScope(CustomerScope.CUSTOMER_SCOPE_NAME,new CustomerScope()); return configurer; }' –
是的,应该是这样。配置器是一个*“简单的'BeanFactoryPostProcessor'实现,它向包含'ConfigurableBeanFactory'的注册自定义'Scope's。”* - 在spring-boot中'AutowireCapableBeanFactory' – zapl