2011-01-14 10 views
3

私の具体的な問題は、同じインターフェースを実装する2つのBeanを構成し、そのインターフェースのタイプのプロパティーを持つ3番目のBeanを持っていることです。私は設定プロパティを使用してプロパティを注入します。だから、と仮定RemoteDataSourceとLocalDataSourceがあるIDataSourceを実装し、dao1がタイプあるIDataSourceの性質を持っている、私のXMLの設定は次のようになります。注釈を使用して設定ファイルから変数を使用してautowiredプロパティを修飾するにはどうすればよいですか?

URL、ファイルパスとデータソースで
<bean id="datasource1" class="com.foo.RemoteDataSource"> 
    <property name="url">${url}</property> 
</bean> 
<bean id="datasource2" class="com.foo.LocalDataSource"> 
    <property name="path">${filepath}</property> 
</bean> 
<bean id="dao1" class="com.foo.MyDAO"> 
    <property name="dataSource">${datasource}</property> 
</bean> 

が含まプロパティファイルで定義されています。私たちは現在、注釈主導の構成を推進しています。データファイルをプロパティファイルで設定するためにDAOに注釈を付ける方法がわかりません。私はこのような何かをしたいが、それは明らかに許可されていません。

@Autowired 
@Qualifier("${datasource}") 
public void setDataSource(IDataSource datasource) {...} 

NB:これは春3

+4

これは、アノテーション設定が適切でない場合の良い例です。 XMLとアノテーションは連携して機能し、それぞれの強みを活用します。 – skaffman

答えて

4

私のソリューションは、このようにした:

@Autowired 
public void setDataProviders(Map<String,IDataProvider> dataProviders) { 
    this.dataProviders = dataProviders; 
} 

@Autowired 
@Value("${cms}") 
public void setDataProviderName(String dataProviderName) { 
    this.dataProviderName = dataProviderName; 
} 

public IDataProvider getDataProvider() { 
    return dataProviders.get(dataProviderName); 
} 

NB:私はこれがない標準的なデータソースから明確にするためにデータプロバイダに命名することを変更しました。それは実際には自家製のRESTクライアントです。

1

私はこれが可能であるとは思わないです。完全にアノテーション駆動型のCDIであっても、設定に応じてBeanをxml経由で切り替えることができます。

5

xmlの設定はありますか?私はあなたがデータソースを持っていると思います。

ハードコードデータソースの修飾子です。次に、プロパティに基づくエイリアスをXMLコンフィグレーションに作成します。

@Autowired 
@Qualifier("designatedDatasource") 
public void setDataSource(IDataSource datasource) {...} 

ような何かそしてXMLで:

<alias name="${dataSource}" alias="designatedDatasource"/> 

私は春の開発者は、あなたがそれをあなたが指定した方法を行うにできるようにみなさかなり確信しているが、個人的に、私は好みますではない。 $ dataSourceの値がどこから得られるのか分かりにくくなってしまいます。注釈の構成可能なプロパティをサポートすると、事柄が複雑化しすぎて混乱が起こりすぎる可能性があると私は考えています。

1

私は同じような問題についていくつか回避しました。私の問題は、私はサービスのための3つの実装を持っていた

は私が

my.serviceImpl = serviceImpl1 

または

my.serviceImpl = serviceImpl2 
のような値を有することができるプレースホルダmy.serviceImpl用のファイルServiceImpl1、ServiceImpl2とServiceImpl3とプロパティで を言います

かそこらで

my.serviceImpl = serviceImpl3 

私のコントローラ@Qualifier($ {my.my.serviceImpl}) を使用できるはずですが、これはうまくいきませんでした。

最後に、私はApplicationConfにBeanを定義しました。

@Bean(name = "myServiceImpl") 
public Service myService() { 

    String beanName = environment.getProperty("my.serviceImpl"); 

     if (beanName.equals("serviceImpl1")) { 
      return new serviceImpl1(); 
     } 
     else if(beanName.equals("serviceImpl2")){ 
      return new serviceImpl2(); 
     } 
     else if(beanName.equals("serviceImpl3")){ 
      return new serviceImpl3(); 
     } 


} 

そして、私のコントローラで、私は

@Autowired 
@Qualifier("myServiceImpl") 
Service myService; 

ない、これはそれを行うための最善の方法である場合かの確認として修飾子を使用するJavaなど。

0

は春3.1のために、あなたの問題はSpring profilesによって解決される:

<bean id="dao1" class="com.foo.MyDAO"> 
    <property name="dataSource">${datasource}</property> 
</bean> 

<beans profile="remote"> 
    <bean id="datasource1" class="com.foo.RemoteDataSource"> 
     <property name="url">${url}</property> 
    </bean> 
<beans> 

<beans profile="local"> 
    <bean id="datasource2" class="com.foo.LocalDataSource"> 
     <property name="path">${filepath}</property> 
    </bean> 
<beans> 

ません@Qualifierが必要な、一つだけあるIDataSource、すべてのプロファイルに。

@Autowired 
public void setDataSource(IDataSource datasource) {...} 
関連する問題