[英]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.