[英]How to specify a default bean for autowiring in Spring?
我正在編寫使用此庫的庫和服務。 我想要一個UsernameProvider
服務,它負責提取登錄用戶的用戶名。 我在庫中使用服務:
class AuditService {
@Autowired
UsernameProvider usernameProvider;
void logChange() {
String username = usernameProvider.getUsername();
...
}
}
我希望有一個UsernameProvider
接口的默認實現,它從JWT的主題聲明中提取用戶名。 但是,在依賴於庫的服務中,我想使用基本身份驗證,因此我創建了一個覆蓋getUsername()
的BasicAuthUsernameProvider
。
當有多個相同類型的autowire候選者( DefaultUsernameProvider
中的DefaultUsernameProvider
和服務中的BasicAuthUsernameProvider
)時,我自然會收到錯誤,因此我必須將服務中的bean標記為@Primary
。 但我不希望庫客戶端指定主bean,而是標記默認值。
添加@Order(value = Ordered.LOWEST_PRECEDENCE)
在DefaultUsernameProvider
沒有工作。
在@ConditionalOnMissingBean
中的Configuration類中添加@ConditionalOnMissingBean
也不起作用。
編輯:結果,在UsernameProvider
實現類上添加@Component
使得@ConditionalOnMissingBean
無用,因為Spring Boot試圖將每個注釋為Component的類自動裝配,因此拋出“找到類型的多個bean”異常。
你沒有發布DefaultUsernameProvider
的代碼,但我猜它注釋為@Component
因此它是自動連線的候選者,與BasicAuthUsernameProvider
相同。 如果要控制使用其中的哪一個,而不是將它們都標記為組件,請添加@Configuration
類,並在那里創建UsernameProvider
bean:
@Configuration
public class ProviderConfig {
@Bean
public UsernameProvider() {
return new BasicAuthUsernameProvider();
}
}
然后,這個bean將在需要的任何地方自動連接
您可以使用@ConditionalOnMissingBean
注釋實例化bean的方法。 這意味着只有在沒有其他UserProvider
被聲明為bean時,該方法才會用於實例化bean。
在下面的示例中,您不能將類DefaultUserProvider
注釋為Component
, Service
或任何其他bean注釋。
@Configuration
public class UserConfiguration {
@Bean
@ConditionalOnMissingBean
public UserProvider provideUser() {
return new DefaultUserProvider();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.