Как Spring @profile работает с наследованием? - PullRequest
0 голосов
/ 09 октября 2018

В настоящее время в проекте у меня есть родительские абстрактные классы, называемые классами объектов страницы, которые подклассируются, как правило, 2 или 3 дочерними классами, каждый из которых используется на основе определенной конфигурации (например: платформа как Android, IOS, Web).

@Component
public abstract class MePage {}


@Profile("android")
@Component
public class AndroidMePage extends MePage {}


@Profile("ios")
@Component
public class IOSMePage extends MePage {}

Всякий раз, когда требуется экземпляр одного из подклассов, он извлекается с использованием

@Autowired
MePage mePage;

Вопрос
Как работает Spring в таких случаях, когда подклассыпомечены @profile, а родительский класс является абстрактным классом, а также компонентом?

Присуждает ли Spring автоматически экземпляр одного из подклассов переменной абстрактного класса @Autowired на основе настроенного профиля?

1 Ответ

0 голосов
/ 09 октября 2018

Вы не должны иметь @Component поверх абстрактного класса, поскольку абстрактные классы не предназначены для создания экземпляров (а не события в Spring).

Кроме того, Spring будет внедрять правильный bean-компонентна основе вашего профиля.

@Autowired
private MePage mePage; // AndroidMePage if android profile is active

@Autowired
private MePage mePage; // IOSMePage if ios profile is active

Если ваш родительский класс не является абстрактным, вам, как обычно, приходится иметь дело с несколькими определениями бинов.

Я думаю, у вас есть как минимум три варианта здесь.

1) Объявить один из бобов как @Primary

@Component
public class MePage {}

@Profile("android")
@Component
@Primary
public class AndroidMePage extends MePage {}

@Profile("ios")
@Component
@Primary
public class IOSMePage extends MePage {}

@Autowired
private MePage mePage; // AndroidMePage if android profile is active

@Autowired
private MePage mePage; // IOSMePage if ios profile is active

2) Автопровода List бобов

@Component
public class MePage {}

@Profile("android")
@Component
public class AndroidMePage extends MePage {}

@Profile("ios")
@Component
public class IOSMePage extends MePage {}

@Autowired
private List<MePage> pages; // MePage and one of AndroidMePage or IOSMePage , based on active profile

3) Добавьте @Qualifier к вашим определениям bean-компонентов и используйте его при автопроводке

@Component
@Qualifier("default")
public class MePage {}

@Profile("android")
@Component
@Qualifier("android")
public class AndroidMePage extends MePage {}

@Profile("ios")
@Component
@Qualifier("ios")
public class IOSMePage extends MePage {}

@Autowired
@Qualifier("default")
private MePage mePage; // MePage is injected, regardless of active profile

@Autowired
@Qualifier("ios")
private MePage mePage; // IOSMePage if ios profile is active

@Autowired
@Qualifier("android")
private MePage mePage; // AndroidMePage if android profile is active
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...