1. ホーム
  2. spring

[解決済み] コンストラクタの引数を必要とする Bean を @Autowire する方法はありますか?

2022-06-09 06:45:51

質問内容

Spring 3.0.5を使用しており、クラスのメンバにできるだけ@Autowireアノテーションを使用しています。 autowireする必要があるBeanの1つは、そのコンストラクタに引数を必要とします。 Springのドキュメントに目を通しましたが、コンストラクタの引数にアノテーションを付ける方法への言及が見つからないようです。

XMLでは、私はビーン定義の一部として使用することができます。 Autowireアノテーションのための同様のメカニズムがあるのでしょうか?

@Component
public class MyConstructorClass{

  String var;
  public MyConstructorClass( String constrArg ){
    this.var = var;
  }
...
}


@Service
public class MyBeanService{
  @Autowired
  MyConstructorClass myConstructorClass;

  ....
}

この例で、MyBeanServiceの"constrArg"の値を@Autowireアノテーションで指定するにはどうしたらよいでしょうか。 何か方法があるのでしょうか?

ありがとうございます。

エリック

どのように解決するのですか?

あなたは @Value アノテーションが必要です。

一般的な使用例として、デフォルトのフィールド値を割り当てるために "#{systemProperties.myProp}" スタイルの表現が可能です。

public class SimpleMovieLister {

  private MovieFinder movieFinder;
  private String defaultLocale;

  @Autowired
  public void configure(MovieFinder movieFinder, 
                        @Value("#{ systemProperties['user.region'] }") String defaultLocale) {
      this.movieFinder = movieFinder;
      this.defaultLocale = defaultLocale;
  }

  // ...
}

レイク 表現言語 > アノテーションの構成


より明確に言うと、あなたのシナリオでは、2つのクラスを配線することになります。 MybeanServiceMyConstructorClass のようなものです。

@Component
public class MyBeanService implements BeanService{
    @Autowired
    public MybeanService(MyConstructorClass foo){
        // do something with foo
    }
}

@Component
public class MyConstructorClass{
    public MyConstructorClass(@Value("#{some expression here}") String value){
         // do something with value
    }
}

更新:複数の異なるインスタンスが必要な場合は MyConstructorClass を異なる値で指定する必要があります。 Qualifierアノテーションを使用する