Вопрос немного риторический.У меня был спор с моими коллегами по поводу следующего шаблона:
@Component
public class MetaService {
public static UserService userService;
public static GroupService groupService;
public static PermissionService permissionService;
// ...more fields
@Autowired
public MetaService(UserService userService,
GroupService groupService
PermissionService permissionService) {
MetaService.userService = userService;
MetaService.groupService = groupService;
MetaService.permissionService = permissionService;
}
}
По сути, MetaService
является точкой входа / оболочкой для нескольких классов Spring bean @Service
.И есть еще одна похожая MetaDao
оболочка для @Repository
класса бобов:
@Component
public class MetaDao {
public static UserDao userDao;
public static GroupDao groupDao;
public static PermissionDao permissionDao;
// ...more fields
@Autowired
public MetaDao(UserDao userDao,
GroupDao groupDao,
PermissionDao permissionDao) {
MetaDao.userDao = userDao;
MetaDao.groupDao = groupDao;
MetaDao.permissionDao = permissionDao;
}
}
Идея такого мета-класса состоит в том, чтобы уменьшить базу кода в классах @RestController
и @Service
,предоставление краткого API для вызова @Service
и @Repository
методов, например:
@RestController
public class UserController {
@PostMapping
public UserCreateResponse createUser(UserCreateRequest request) {
MetaService.userService.createAndReturn(userEntity);
// other service calls
}
}
Другими словами, это альтернатива наличию @Autowired
полей / конструкторов для каждого @Service
в каждом @Controller
и т. Д. На мой взгляд, этот подход значительно сокращает объем повторяющегося кода.
Мои коллеги говорят, что такой подход затрудняет понимание / сопровождение кода, поскольку объединение @Service
компонентов в одномместо скрывает модель зависимости других компонентов, которые их используют.Другими словами, если бы были поля, объявленные для UserController
класса.Было бы проще быстро выяснить, от каких компонентов зависит UserController
.Кроме того, сложнее издеваться над такими зависимостями, выполняя модульное тестирование.И самое главное, что такой подход супер-анти-паттерн .В то время как я могу согласиться с насмешливой частью, все остальное кажется мне нелепым.
Вопрос в том, действительно ли это как-то против паттерна?