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;
}
添加回答
举报