2016-03-23 38 views
0

如何在庫項目中配置依賴項注入?

讓我用下面的例子來說明這個問題。如何在庫項目中配置依賴注入?

Maven的圖書館項目

ReservationAPI

com.example.reservation-API

該項目包含一個名爲ReservationApiClient一個方便的類,它使用一個RestTemplate(Spring框架)的進行HTTP調用。

是否有可能在此庫項目中創建RestTemplate字段@Autowired而不是自己實例化它?

Maven的可執行項目

org.company.application

這個項目是一個春天啓動應用程序和使用上述ReservationAPI作爲一個依賴。此應用程序將爲該庫中包含的便捷類ReservationApiClient創建一個@Bean,然後將執行其公共方法,然後執行HTTP請求。

上述場景的良好策略和/或最佳實踐是什麼?

回答

0

如果你在自己的庫項目中包含自動裝配,你可以這樣做,儘管這意味着它總是需要和Spring應用程序上下文一起使用來獲取值,除非你也有getter/setter方法。不過,我不認爲使用RestTemplate作爲自動裝配對象是有意義的,因爲RestTemplate沒有任何特定的內容,並且除非命名了Bean,否則只有一個類的Bean定義。無論如何,RestTemplate的所有方法都需要URI。所以在這種情況下,我會在應用程序中使用您的ReservationApiClient的bean。

另一種方法是如果你想在你的庫中包含Spring依賴項(我猜你已經使用RestTemplate),你可以聲明你的ReservationApiClient爲@Service或@Component,然後使用@ComponentScan註釋在您的主要Spring Boot項目中搜索該庫以便將組件包括在Bean註冊表中。

另一種選擇是使用像Spring Boot的Autoconfigure這樣的功能來創建使用第三方庫的工廠,並根據應用程序設置中的屬性來配置它們。 auto configuration documentation將是一個開始的好地方。您可以看到他們擁有的啓動器項目on GitHub以及與之相關聯的Autoconfigure classes

讓我知道這是否有任何意義。

+0

我選擇了一個簡單的例子,只是爲了讓問題更容易閱讀,但RestTemplate確實有用於依賴注入的用例。在RestTemplate上設置屬性(如TimeOut等),然後將整個庫中的同一個對象作爲單例共享,這就是我喜歡使用Spring Framework的原因。但我想你是對的,它需要一個應用程序上下文,而不是不可執行的庫項目的情況。 –

+0

你的第二個使用組件掃描的建議可以在這個簡單的例子中工作,但是如果該項目是開源的呢?這需要執行的應用程序使用Spring框架,這對於庫的用戶來說是一個很大的限制。 –

+0

如果您使用的庫不包含Spring框架,那麼您應該在應用程序框架中聲明bean(如果它們很簡單)。否則,你可能會想創建工廠,因爲工廠應該能夠進行其他配置。我認爲這個Spring Boot功能用於自動配置http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html將是你正在尋找的配置事情的方式,你想要使用你的主應用程序的屬性。 –