10

次のように、@Qualifier の属性としてプロパティ プレースホルダーを使用しようとしています。

@Autowired
@Qualifier("${beanName}")
private MyBean myBean;

ただし、プロパティ プレースホルダーが文字列値として使用できる場合でも、これは機能しません。

@Value("${beanName}")
private String beanName;

ここでの良い回避策は何でしょうか、どうもありがとう。

4

3 に答える 3

16

まったく同じ問題が発生しました。リソースを使用するだけ

@Resource(name="${beanName}")
private MyBean myBean;
于 2015-05-08T19:57:50.887 に答える
1

コメントを残すことができないので、これが私の答えです:

Adam B が言ったように、おそらくスプリング プロファイルを使用して、目的の結果を達成できます (どの結果を目指していますか?)。

他にできることは次のとおりです。

次のように、xml コンテキスト構成で (spring util 名前空間を使用して) マップを構成します。

 <util:map id="mapId" key-type="java.lang.String" value-type="com.xxx.interface-or-superclass">
        <beans:entry key="${property.bean.name.1}" value-ref="bean1-defined-elsewehere"/>
        <beans:entry key="${property.bean.name.2}" value-ref="bean2-defined-elsewehere"/>
        <beans:entry key="${property.bean.name.3}" value-ref="bean3-defined-elsewehere"/>
  </util:map> 

次に、このマップを、eg という名前の Bean にロードできます。「com.xxx.BeanSelector」

@Value("#{mapId}")
private Map<String, com.xxx.interface-or-superclass> myMap;

この Bean に次のようなメソッドを追加します。

public interface-or-superclass getBean(String beanName){
    return myMap.get(beanName);
}

これで、次のような最終クラスを作成できます。

@Autowired
private BeanSelector beanSelector;

@Value("${property.name.the.bean.you.want.to.use}")
private String beanName;

private interface-or-superclass myBean;

その後、myBean をインスタンス化できます (インターフェイス InitializingBean を実装している場合は、メソッド afterPropertiesSet() 内で可能性があります)。

この上:

myBean = beanSelector.getBean(beanName);
// then check ifthe bean is not null or something like that

少し面倒ですが、達成したいことに基づいて別の方法で行動できるかもしれませんが、これは回避策です。

于 2013-08-13T18:41:37.060 に答える
0

試してみてください(解決する問題がよくわかりません)。通常どおり固定 Bean 名を使用できます (プレースホルダーを使用したオートワイヤーはサポートされていません) が、プロパティ値に基づいて異なる xml から異なる Bean 実装をロードできます。
. それ以外の場合は、Bean エイリアスに基づくソリューションについて考えてください。私の2セント

于 2013-08-13T19:26:51.487 に答える