2016-01-31 14 views
10

スプリングのJavaコンフィグレーションにスプリングBeanを作成し、実行時に渡されるコンストラクタ引数を使用したいとします。私は、コンストラクタでいくつかの引数を期待するbean fixedLengthReportがあるJavaの設定を次のように作成します。実行時コンストラクタ引数を持つスプリングBean

@Configuration 
Public AppConfig { 

@Autowrire 
Dao dao; 

@Bean 
@Scope(value = "prototype") 
**//SourceSystem can change at runtime** 
public FixedLengthReport fixedLengthReport(String sourceSystem) { 
     return new TdctFixedLengthReport(sourceSystem, dao); 
} 

が、私は何のBeanが見つからないのでsourceSystemが配線できなかったことをエラーを取得しています。実行時コンストラクタ引数を使ってBeanを作成するにはどうすればよいですか?私は春4.2

+0

ここで、「SourceSystem」のBeanを定義しましたか? – user2004685

+0

SourceSystemはSpring Beanではありません。これは単なる文字列であり、その値は実行時に決定されるとしましょう。私は私の質問を更新しました –

+0

'TdctFixedLengthReport'の実装を提供できますか? – user2004685

答えて

12

あなたは次のaproach使用することができます。春はスタート直後にこのBeanをインスタンス化しないこと、

@Configuration 
Public AppConfig { 

    @Autowired 
    Dao dao; 

    @Bean 
    @Scope(value = "prototype") 
    @Lazy(value = true) 
    public FixedLengthReport fixedLengthReport(String sourceSystem) { 
     return new TdctFixedLengthReport(sourceSystem, dao); 
    } 
} 

@Lazy手段を、それを行います後でオンデマンド。さて、あなたが次に何をする必要があり、このBeanのインスタンスを取得する:あなたのBeanが起動時にインスタンス化することができないのため、

@Controller 
public class ExampleController{ 

    @Autowired 
    private BeanFactory beanFactory; 

    @RequestMapping("/") 
    public String exampleMethod(){ 
     TdctFixedLengthReport report = 
     beanFactory.getBean(TdctFixedLengthReport.class, "sourceSystem"); 
    } 
} 

注意を、あなたが直接あなたのBeanをautowireてはいけません。さもなければ@Lazyアノテーションは無視され、Springは単独でBeanのインスタンスを作成しようとします。次の使用法はエラーを引き起こします:

@Controller 
public class ExampleController{ 

    //next declaration will cause ERROR 
    @Autowired 
    private TdctFixedLengthReport report; 

} 
+1

'@ Autowire' Annotationでタイプミスを変更してください。 (そして、はい、これは私をたくさん悩ましました!)) – Dominik

+0

@Dominik thanx a lot。あなたが同じタイプミスを見つけたら、私の投稿を編集してください。) –

+0

少なくとも6文字を編集する必要があります。質問(1文字)とあなたの投稿(3文字が編集されました)を編集しようとしたときに少なくとも私は何が起こったのですか:-) – Dominik

2

あなたのコードを使用しています

は、パラメータがたBeanFactory#getBean(文字列名、オブジェクト...引数)メソッドを使用してプロトタイプを取得するには、正常に見えます。

を参照してください。Spring Java Config: how do you create a prototype-scoped @Bean with runtime arguments? BeanFactory#getBean(String name、Object ... args)はあなたが探しているものです。

あなたのIDEA(私のケースではIntelliJ IDEAバージョン15.)がエラーを出すと思います。実行時/コンパイル時のエラーではありません。

IntelliJでは、Spring検査の設定を変更できます。

  • ファイル→設定。
  • 検索ボックスにタイプ検査を行います。
  • Spring Core-> Code-> Autowire for Bean Classesにアクセスしてください。 「弱い警告」と「エラー」から
  • 変更
+0

正解、私はアイデアバージョン15を使用しているので、それが原因である可能性があります。私はそれを削除する設定を変更します。あなたのお手伝いをしてくれてありがとう。 –

関連する問題