2017-08-16 4 views
0

私は設定ファイルを読み込み、それを使って任意のタイプの新しいBeanをビルドしてBeanファクトリーに追加しようとしているspringbootスターターモジュールを持っています。springbootスターターモジュールの設定を読み取ってBeanを動的に登録する

@Configuration 
class SomeConfig implements BeanFactoryAware { 

    BeanFactory beanFactory 

    @Autowired 
    ConfigData configData 

    @Override 
    void setBeanFactory(BeanFactory beanFactory) { 
     this.beanFactory = beanFactory  
    } 

    @PostConstruct 
    void addMoreBeans() { 
     ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory 
     configurableBeanFactory.registerSingleton('someObject', new SomeObject()) 
    } 
} 


@RestController //(in the application) 
class SomeController { 
    @Autowired 
    SomeObject someObject // this is null. 
} 

IタイプのBeanにアクセスしようとする「SomeObjectの」上記設定Beanを含有スターターモジュールを使用している(コントローラBean内)SpringBootApplicationでは、autowiredいません。

私は、起動プロセスの後半でこれらのBeanを初期化しますが、自動配線が間に合わないことを確認しています。

最初に初期化するためにスターターモジュール内のBeanを強制的に使用する必要はありますか。 ?

+0

私はコードをテストしようとします。 'BeanFactory'は' registerSingleton'メソッドを持っていないことがわかりました。私の春は4.3.10です。 – diguage

+0

** ConfigurableBeanFactory **です。上記の私の質問を編集しました。 – KrishVilay

答えて

0

addMoreBeansは、setBeanFactoryを実行する前に実行することができます。次のように

だから、コードを書くことがあります。

@Configuration 
class SomeConfig implements BeanFactoryAware { 

    BeanFactory beanFactory 

    @Autowired 
    ConfigData configData 

    @Override 
    void setBeanFactory(BeanFactory beanFactory) { 
     this.beanFactory = beanFactory 
     beanFactory.registerSingleton('someObject', new SomeObject()  
    } 
} 

@Beanは良い方法かもしれません。

@Configuration 
class SomeConfig2 { 
    @Bean 
    public SomeObject getSomeObject() { 
     return new SomeObject(); 
    } 
} 
+0

この場合、ヌルポインタがスローされます。最終的には登録されますが、自動配線が@RestController Beanで動作するのは間に合っていません。 – KrishVilay

+0

はい。私のコードはnullポインタを投げた。もう一度考えてみましょう。 – diguage

+0

2番目のオプションは、私が探しているものでは機能しません。なぜなら、Beanのタイプがわからず、Beanのタイプが設定によって駆動されるからです。 – KrishVilay

関連する問題