управление двумя или более реализациями одного интерфейса Spring с @PROFILE

мы хотим иметь две реализации интерфейса для режима производства и разработки:

рассмотрите интерфейс:

public interface AccountList {
        public List<Account> getAllAccounts(String userID) ;
}

С двумя реализациями:

реализация базы

 @Service
 public AccountListImp1 interface AccountList { ... }

и некоторые реализации развития

 @Service
 @Profile("Dev") 
 public AccountListImp2 interface AccountList { ... }

когда я пытаюсь использовать бобовые:

public class TransferToAccount{
    @Autowired
    private AccountServices accountServices;

}

Я получаю эту ошибку:

No qualifying bean of type [AccountList] is defined: expected single matching bean but found 2: coreSabaAccountList,dummyAccountList

во время разработки мы устанавливаем spring.profiles.active to dev as ниже:

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>Dev</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

я предположил, что установка имени профиля, сделает spring классифицировать бобы с различными профилями, и использовать их базу на имя профиля.

пожалуйста, дайте мне знать, как я могу это решить? Я могу использовать @Primary или изменить applicationContext.xml, но я думаю, что @profile должен решить мою проблему.

1 ответов


Я думаю, что ваша проблема в том, что ваш базовый класс AccountListImp1 не отмечен ни для одного профиля. Я думаю, что вы ожидаете, что если активный профиль не определен, бобы без спецификации профиля будут работать, но когда вы определяете профиль, бобы, которые имеют такую спецификацию, будут переопределять бобы, которые реализуют тот же интерфейс и не имеют определения профиля. Это не работает таким образом.

при работе с активным профилем X весна начинает все фасоли которые не предназначен для любого профиля и бобы, предназначенные для текущего профиля. В вашем случае это вызывает столкновение между 2 реализации.

Я думаю, что если вы хотите использовать профили, вы должны определить по крайней мере 2: Dev и Prod (имена взяты просто для примера.)

теперь Марк AccountListImp1 as Prod и AccountListImp2 as Dev:

@Service
@Profile("Prod") 
public AccountListImp1 interface AccountList { ... }
and some development implementation

@Service
@Profile("Dev") 
public AccountListImp2 interface AccountList { ... }

Я считаю, что такая конфигурация будет работать. Удача. Я буду рад узнать, было ли это полезный.