2016-05-13 12 views
2

私はマルチテナントの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がスコープ自体でないという事実を心配しています。

このアプローチの作品とスケールは、より複雑なシステムのためでしょうか?

+1

工場がスコープする必要はありません、既存のスコープを認識するだけで、スコープにBeanの格納/取得を委任できます。 – zapl

+0

工場にスコープを認識させるにはどうしたらいいですか?それは私の設定でこれを持っているだけで十分ですか? '@Beanパブリック静的CustomScopeConfigurer customScope(){ CustomScopeConfigurerコン=新しいCustomScopeConfigurer()。 configurer.addScope(CustomerScope.CUSTOMER_SCOPE_NAME、新しいCustomerScope()); 戻り設定者。 } ' –

+0

はい、それはそれであるべきです。コンフィギュラは*です*「'ConfigurableBeanFactory'を含むと'カスタムScope'(複数可)を登録するシンプルな 'BeanFactoryPostProcessor'実装。」 - 春 - ブートで' AutowireCapableBeanFactory' – zapl

答えて

1

私のコードサンプルは、実際には正しかったです。 たBeanFactory自体をスコープする必要はありません、それはちょうど私の場合の構成で達成することができる範囲の認識されなければなら:

@Bean 
public static CustomScopeConfigurer customScope() { 
    CustomScopeConfigurer configurer = new CustomScopeConfigurer(); 
    configurer.addScope(CustomerScope.CUSTOMER_SCOPE_NAME, new CustomerScope()); 
    return configurer; 
} 
関連する問題