Как пропустить класс Service, если профиль Spring отличается от указанного, используя аннотацию @Profile

1

У меня есть класс обслуживания, отмеченный аннотациями:

@Service(value="myService")
@Profile("test")
public class MyServiceImpl implements MyService{
 ...
 }

Поэтому, если текущий профиль Spring "test", методы этого класса будут использоваться для сервиса myService. Хотя я хотел бы также иметь еще один класс с теми же аннотациями, возможно, с @Profile("!test") который будет загружаться во всех других случаях, когда профиль не тестируется,
Как я могу это сделать без настройки чего-либо в файлах конфигурации Spring.xml Spring? Я хотел бы использовать просто аннотации.

  • 0
    Вы только что попробовали это? ! Особенность была в работах экспериментально, и я думаю, что она превратилась в 4.
  • 0
    да, у меня не работает
Теги:
spring
spring-mvc
annotations
javabeans

1 ответ

2
Лучший ответ

Вам нужно определить другой bean-компонент так:

@Service(value="myServiceDefault")
public class MyServiceImpl implements MyService{
 ..

}

Затем измените исходный код для тестового профиля на:

@Service(value="myService")
@Profile("test")
@Primary
public class MyServiceImpl implements MyService{
 ...
 }

Что это такое - зарегистрировать реализацию для всех используемых профилей, а затем, когда активен тестовый профиль, используется другая реализация из-за аннотации @Primary

Если вы используете Spring 4, вы можете придумать еще более сложные стратегии конфигурации, используя @Conditional аннотацию

  • 2
    Хорошо, но мне нужны сервисы с одинаковыми именами, они должны быть прозрачными для клиента. В вашем примере вы используете 2 разных имени myServiceDefault и myService
  • 0
    Вы можете использовать то же имя, нет проблем. Аннотация @Primary позволяет Spring выбирать этот сервис среди других
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню