В коде проекта, над которым я работаю, я столкнулся со странным подходом.
Уровень пользовательского интерфейса получает зависимости, используя своего рода Service Locator, который является классом со статическими методами:
public class ServiceManager {
public static MailService getMailService() {
...
}
public static UserInfoService getUserInfoService() {
...
}
...
}
Зависимости, которые «распределяются» этим классом, внедряются в него с помощью Spring Framework.
В чем может быть причина такого подхода? Я вижу только недостатки. Поскольку методы локатора являются статическими, интерфейса нет. Отсутствие интерфейса усложняет рассуждения о цели класса. Клиенты этого класса тесно связаны с ним (помните, там нет интерфейса), что делает невозможным их повторное использование в других местах.
Не лучше ли позволить Spring вставлять зависимости непосредственно в классы пользовательского интерфейса?