Spring @Profile 如何与继承一起工作?

问题描述 投票:0回答:1

当前在一个项目中,我有称为页面对象类的父抽象类,它们通常由 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;

问题

子类用

@Profile
注解,而父类是抽象类又是组件的情况下,Spring是如何工作的?

Spring 是否会根据配置的配置文件自动将子类之一的实例分配给

@Autowired
抽象类变量?

java spring inheritance dependency-injection
1个回答
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
的 beans

@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
© www.soinside.com 2019 - 2024. All rights reserved.