Вы не должны иметь @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