2015-09-15 2 views
1

Мне нужен интерфейс autwire, который имеет пару реализации. Я использую @Qualifier для достижения this-spring autowire multiple implementation

Интерфейс DataSourceConfig

public interface DataSourceConfig { 
    DataSource getDataSource(); 
} 

Реализация 1:

@Configuration("mysql") 
public class MySqlDataSourceConfig implements DataSourceConfig { 

@Bean 
public DataSource getDataSource() { 
    System.out.println("MySQL datasource"); 

    //some implementation 

    return dataSource; 
} 
} 

Осуществление 2:

@Configuration("hsql") 
public class HsqlDataSourceConfig implements DataSourceConfig { 

@Bean 
public DataSource getDataSource() { 
    System.out.println("hsql dataSource"); 
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL).addScript(
      "classpath:database/schema.sql").addScript(
      "classpath:database/datascript.sql").build(); 
    } 
} 

Клиент:

@Configuration 
public class Client { 

@Autowired 
@Qualifier("hsql") 
DataSourceConfig hsqlDataSource; 

@Autowired 
@Qualifier("mysql") 
DataSourceConfig mysqlDataSource; 

} 

только один источник данных (mysqlDataSource) создается и я вижу следующее сообщение в моем журнале. Это в режиме INFO, хотя -

org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition Overriding bean definition for bean 'hsqlDataSource': 
+0

Не путайте имя '@Conf iguration' в качестве имени вашего компонента DataSource. –

+0

@SotiriosDelimanolis Если я даю имя bean-компоненту и добавляю квалификатор на основе имени bean-компонента, он не автоустанавливает какой-либо источник данных -org.springframework.beans.factory.NoSuchBeanDefinitionException: не имеет определяющего компонента типа [com.sample.config .DataSourceConfig], найденный для зависимости: ожидается как минимум 1 компонент, который квалифицируется как кандидат на автоподключение для этой зависимости. – Pankaj

+0

Я хочу сказать, что '@Qualifier (" hsql ")' фактически ссылается на компонент 'HsqlDataSourceConfig', определенный с помощью' @Configuration ("hsql") '. Отправьте MCVE. –

ответ

0

Чтобы решить проблему нескольких одинаковых типов (DataSource), мы должны использовать режим автоматического связывания «по имени». По умолчанию используется «по типу». Установите атрибут «имя» в аннотацию @Bean.

Осуществление 1:

@Configuration 
public class MySqlDataSourceConfig implements DataSourceConfig { 

    @Bean(name="mysql") 
    public DataSource getDataSource() { 
     System.out.println("MySQL datasource"); 
     MysqlDataSource dataSource= new MysqlDataSource(); 
     // ... dataSource parameters 
     return dataSource; 
    } 
} 

Осуществление 2:

@Configuration 
public class HsqlDataSourceConfig implements DataSourceConfig { 

    @Bean(name="hsql") 
    public DataSource getDataSource() { 
    System.out.println("hsql dataSource"); 
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL).addScript(
     "classpath:database/schema.sql").addScript(
     "classpath:database/datascript.sql").build(); 
    } 
} 

Клиент:

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Component; 

@Component 
public class Client { 

    @Autowired 
    @Qualifier("hsql") 
    private javax.sql.DataSource hsqlDataSource; 

    @Autowired 
    @Qualifier("mysql") 
    private javax.sql.DataSource mySqlDataSource; 
} 
+0

Не работает. Получено это исключение. Не найден квалифицированный компонент типа [com.sample.config.DataSourceConfig], найденный для зависимости: ожидал как минимум 1 компонент, который квалифицируется как кандидат на автоподключение для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (required = true), @ org.springframework.beans.factory.annotation.Qualifier (value = hsql)} – Pankaj