gpt4 book ai didi

java - Spring @profile 如何与继承一起工作?

转载 作者:行者123 更新时间:2023-12-02 10:44:05 30 4
gpt4 key购买 nike

目前在一个项目中,我有称为页面对象类的父抽象类,它们通常由 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 将根据您的配置文件注入(inject)正确的 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) Autowiring bean的列表

@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 定义中,并在 Autowiring 时使用它

@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

关于java - Spring @profile 如何与继承一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52720198/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com