簡體   English   中英

如何使用注釋從配置文件中使用變量限定autowired屬性?

[英]How can I qualify an autowired property with a variable from a config file using annotations?

我的具體問題是我已經配置了兩個實現相同接口的bean,並且我有第三個bean,它具有該接口類型的屬性。 我使用config屬性注入屬性。 因此,假設RemoteDataSource和LocalDataSource實現IDataSource並且dao1具有IDataSource類型的屬性,我的XML配置可能如下所示:

<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>

使用url,filepath和datasource在包含的屬性文件中定義。 我們現在正在推動注釋驅動的配置,我不知道如何注釋我的dao以將數據源配置在屬性文件中。 我想做這樣的事情,但顯然不允許:

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

注意:這是春天3

你有任何xml配置嗎? 我假設你做了,因為你有一個數據源。

硬編碼數據源的限定符,然后在xml配置中創建別名,該別名基於屬性進行別名。

就像是

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

然后在xml中:

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

我很確定春天開發人員考慮允許你按照你指定的方式去做,但就個人而言,我寧願不這樣做。 解決它從哪里獲得$ dataSource值可能會變得非常棘手。 我還認為,在注釋中支持可配置屬性會使事情過於復雜化,並且會產生太多潛在的混淆。

我的解決方案是:

@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);
}

注意:我將命名更改為DataProvider以消除規范DataSource的歧義,而不是。 它實際上只是一個自制的REST客戶端。

我做了一些解決我遇到的類似問題的工作。

我的問題是我有三個服務實現說ServiceImpl1,ServiceImpl2和ServiceImpl3,並且在占位符my.serviceImpl的屬性文件中我可能有類似的值

my.serviceImpl = serviceImpl1

要么

my.serviceImpl = serviceImpl2

要么

my.serviceImpl = serviceImpl3

所以在我的控制器中,我應該可以使用@Qualifier($ {my.my.serviceImpl}),但這沒有用,我甚至試過@value但它也失敗了。

所以最后我在我的ApplicationConf.java中定義了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;

不確定這是否是最好的方法。

我不認為這是可能的。 即使在完全注釋驅動的CDI中,依賴於配置的切換bean也是通過xml完成​​的。

對於Spring 3.1,您的問題由Spring配置文件解決:

<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) {...}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM