簡體   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