簡體   English   中英

Spring 自動裝配唯一的實現而不定義 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 通過掃描代碼自動連接接口的唯一實現。 這可能嗎?

換句話說,目前這個問題有兩種解決方案,我問是否有第三種:

  1. @Service聲明從接口OrderingService移動到實現DefaultOrderingService
  2. 在Configuration中,定義具體的Bean如下:
 @Configuration 
 public class DefaultConfig {
      @Bean
      public OrderingService orderingService() {
          return new DefaultOrderingService();
      }
 }

問題:是否可以讓 Spring 自動掃描(然后 Spring 僅找到 OrderingService 的一種實現)和自動裝配? 如果是,該怎么做? 如果不是,這不是一個好習慣嗎?為什么?

我不知道這是否可行,但我有一個不同的方法可能會有所幫助:

添加配置文件以保存 bean 的類型,假設OrderingService有兩種實現,一種是FAKEDEFAULT ,以便僅在運行時擁有一個,您必須在項目上下文中聲明這兩個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM