繁体   English   中英

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

[英]How does Spring @profile work with inheritance?

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

您不应在抽象类之上使用@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)自动连线一个bean 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM