Spring @profile如何与继承一起使用?

时间:2018-10-09 11:40:00

标签: java spring inheritance dependency-injection

当前在一个项目中,我有一个称为页面对象类的父抽象类,通常由2或3个子类子类化,每个子类都基于特定的配置使用(例如:Android,IOS,Web等平台)。 / p>

@Component
public abstract class MePage {}


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


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

每当需要一个子类的实例时,便使用

对其进行检索
@Autowired
MePage mePage;

问题
在子类用@profile注释且父类既是抽象类又是组件的情况下,Spring如何工作?

Spring是否根据配置的配置文件将子类之一的实例自动分配给@Autowired抽象类变量?

1 个答案:

答案 0 :(得分:1)

您不应在抽象类的顶部使用@Component,因为抽象类不是要实例化的(Spring不会进行事件处理)。

最重要的是,Spring将根据您的个人资料注入合适的bean。

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

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

如果您的父类不是抽象类,则您必须照常处理多个bean定义。

我认为您在这里至少有三个选择。

1)将其中一个bean声明为@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