Как я могу определить свойство autowired с переменной из файла конфигурации, используя аннотации? - PullRequest
3 голосов
/ 15 января 2011

Моя конкретная проблема заключается в том, что я настроил два 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, пути к файлу и источника данных во включенном файле свойств. Сейчас мы предпринимаем усилия для настройки на основе аннотаций, и я не уверен, как аннотировать мой dao, чтобы поместить настроенный источник данных в файл свойств. Я хочу сделать что-то подобное, но это явно не разрешено:

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

Примечание: это весна 3

Ответы [ 5 ]

5 голосов
/ 15 января 2011

Есть ли у вас xml-конфигурация?Я предполагаю, что вы делаете, поскольку у вас есть источник данных.

Жесткий код классификатора для источника данных, а затем создайте псевдоним в конфигурации xml, псевдонимы которого основаны на свойстве.

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

А затем в xml:

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

Я почти уверен, что разработчики пружин рассмотрели возможность сделать это так, как вы указали, но лично я предпочел бы не делать этого.,Выяснить, откуда он получает значение $ dataSource, может оказаться довольно сложно.Я также думаю, что поддержка настраиваемых свойств в аннотациях слишком усложнит ситуацию и приведет к слишком большой путанице.

4 голосов
/ 21 января 2011

Мое решение было таким:

@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, чтобы избавиться от неоднозначности с каноническим источником данных, а это не так. На самом деле это просто самодельный REST-клиент.

1 голос
/ 15 ноября 2013

Я немного обошел проблему, с которой столкнулся.

Моя проблема заключалась в том, что у меня было три реализации для Service, например ServiceImpl1, ServiceImpl2 и ServiceImpl3 в файле свойств для заполнителя my.serviceImpl у меня могут быть значения как

my.serviceImpl = serviceImpl1

или

my.serviceImpl = serviceImpl2

или

my.serviceImpl = serviceImpl3

Так что в моем контроллере я могу использовать @Qualifier ($ {my.my.serviceImpl}) но это не сработало, я даже попытался @value для, но также не получилось.

Итак, наконец, я определил bean-компонент в своем ApplicationConf.java как

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

Хотя не уверен, что это лучший способ сделать это.

1 голос
/ 15 января 2011

Я не думаю, что это возможно.Даже в CDI, который полностью управляется аннотациями, переключение bean-компонентов в зависимости от конфигурации выполняется через xml.

0 голосов
/ 12 декабря 2015

Для 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) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...