[英]Simple Spring Java @Configuration to @Autowire without @Bean
[英]Spring autowire the only implementation without defining the bean
我有以下情況:
@Service
interface OrderingService {
}
public class DefaultOrderingService implements OrderingService {
}
@RestController
public class DefaultOrderingRestController {
private final OrderingService orderingService;
public DefaultOrderingRestController(OrderingService orderingService) {
this.orderingService = orderingService;
}
}
我希望 Spring 通過掃描代碼自動連接接口的唯一實現。 這可能嗎?
換句話說,目前這個問題有兩種解決方案,我問是否有第三種:
@Service
聲明從接口OrderingService
移動到實現DefaultOrderingService
@Configuration
public class DefaultConfig {
@Bean
public OrderingService orderingService() {
return new DefaultOrderingService();
}
}
問題:是否可以讓 Spring 自動掃描(然后 Spring 僅找到 OrderingService 的一種實現)和自動裝配? 如果是,該怎么做? 如果不是,這不是一個好習慣嗎?為什么?
我不知道這是否可行,但我有一個不同的方法可能會有所幫助:
添加配置文件以保存 bean 的類型,假設OrderingService
有兩種實現,一種是FAKE
和DEFAULT
,以便僅在運行時擁有一個,您必須在項目上下文中聲明這兩個 bean,如下所示:
@Bean
OrderingService fakeOrderingService() {
return new FakeOrderingService();
}
@Bean
OrderingService defaultOrderingService() {
return new DefaultOrderingService();
}
如果您想要其中之一,則必須添加 ConditionalOnProperty,如下所示:
@Bean
@ConditionalOnProperty("app.config.type", havingValue = "FAKE")
OrderingService fakeOrderingService()..
@Bean
@ConditionalOnProperty("app.config.type", havingValue = "DEFAULT", matchIfMissing = true)
OrderingService defaultOrderingService()...
matchIfMissing = true
這將有所幫助,如果配置未添加到您的環境中,因此 spring 將自動裝配defaultOrderingService
以防屬性缺失或屬性值為DEFAULT
,如果屬性值為FAKE
fakeOrderingService
我希望這會有所幫助
您的第三個解決方案的問題在於它依賴於接口的實現。 如果沒有找到對應的實現,spring 會報錯。 所以我想這絕對不是一個好習慣。 spring @service 注釋也不會被繼承。 但是,如果您仍然想要任何替代解決方案。 您可能更願意為每個實現定義單獨的 bean,並使用限定符從應用程序上下文中獲取 bean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.