私はマルチテナントのSpring起動アプリケーションを作成しようとしていますが、サーバー起動時に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();
}
サーバを起動、2つのスケジューラを作成する必要があり、そのそれぞれが「デフォルトの作成」の独自のインスタンスを実行します。 テナントがアプリケーションにアクセスするときは、このスケジューラの独自のインスタンスを取得する必要があります。 これはうまくいくようですが、これが正しいことであるかどうかは疑問です。 特に、私はbeanFactoryがスコープ自体でないという事実を心配しています。
このアプローチの作品とスケールは、より複雑なシステムのためでしょうか?
工場がスコープする必要はありません、既存のスコープを認識するだけで、スコープにBeanの格納/取得を委任できます。 – zapl
工場にスコープを認識させるにはどうしたらいいですか?それは私の設定でこれを持っているだけで十分ですか? '@Beanパブリック静的CustomScopeConfigurer customScope(){ CustomScopeConfigurerコン=新しいCustomScopeConfigurer()。 configurer.addScope(CustomerScope.CUSTOMER_SCOPE_NAME、新しいCustomerScope()); 戻り設定者。 } ' –
はい、それはそれであるべきです。コンフィギュラは*です*「'ConfigurableBeanFactory'を含むと'カスタムScope'(複数可)を登録するシンプルな 'BeanFactoryPostProcessor'実装。」 - 春 - ブートで' AutowireCapableBeanFactory' – zapl