[英]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.