1 回答

TA貢獻1848條經驗 獲得超2個贊
問題到底。在服務中使用那么多@Value 注釋是好方法嗎?/(使用 yml 文件存儲 URL)。
這不是因為您注入了太細粒度的屬性。這些應該被封裝到一個特定的對象中:更具可讀性、可維護性和可測試性。
Spring 提供@ConfigurationProperties這樣做。
它必須注釋包含屬性的類。
你可以這樣做:
@Component
@ConfigurationProperties("external.library.url")
public class BookStoreUrlProperties {
private Empik empik = new Empik();
private Merlin merlin = new Merlin();
// getters/setters
public BookStoreUrlProperties() {
}
public static class Empik {
private String romances;
private String biographies;
private String crime;
private String guides;
private String fantasy;
// getters/setters
}
public static class Merlin {
private String romances;
private String biographies;
private String crime;
private String guides;
private String fantasy;
// getters/setters
}
}
然后像任何其他 bean 一樣注入這個 bean:
@Autowired
BookStoreUrlProperties bookStoreUrlProperties;
并使用 getter 檢索 url,例如:
String RomanceUrl = bookStoreUrlProperties.getMerlin().getRomances();
我建議的另一種選擇是將屬性(merlin 和 empik)拆分為兩個屬性類。
關于服務類中的重復,您可以通過提取參數重構輕松地將它們分解出來,因為唯一的區別是 URL 值。
例如 :
public Map<Bookstore, List<Book>> get15BooksFromGuidesCategory() {
return get15BooksFrom(guidesCategoryEmpikURL, guidesCategoryMerlinURL)
}
public Map<Bookstore, List<Book>> get15BooksFromBiographiesCategory() {
return get15BooksFrom(biographiesCategoryEmpikURL, biographiesCategoryMerlinURL)
}
public Map<Bookstore, List<Book>> get15BooksFrom(String bookStoreEmpikURL, String bookStoreMerlinURL) {
bookstoreWith15CategorizedBooks.put(Bookstore.EMPIK, empikBookService
.get15BooksFromCategory(connect(bookStoreEmpikURL)));
bookstoreWith15CategorizedBooks.put(Bookstore.MERLIN, merlinFetchingBookService
.get15BooksFromCategory(connect(bookStoreMerlinURL)));
return bookstoreWith15CategorizedBooks;
}
添加回答
舉報