Вы можете создать BeanPostProcessor , чтобы сделать это и зарегистрировать его в контексте приложения. Постпроцессор может искать AbstractController экземпляров с надлежащим соглашением об именах, генерировать имя валидатора, создавать экземпляр объекта валидатора с помощью отражения и устанавливать его в контроллере. Как то так:
public Object postProcessAfterInitialization(final Object bean, final String name) throws BeansException {
if (bean instanceof AbstractController) {
String controllerName = bean.getClass().getSimpleName();
if(controllerName.endsWith("Controller")) {
String validatorName = controllerName.replaceFirst("Controller$", "Validator");
try {
Class<?> validatorClass = Class.forName(validatorName);
Validator validator = (Validator)validatorClass.newInstance();
((AbstractController)bean).setValidator(validator);
} catch(Exception e) {
throw new FatalBeanException("Cannot instantiate validator", e);
}
}
}
return bean;
}
В качестве альтернативы, если валидаторы зарегистрированы как бины Spring, потому что им нужно внедрение зависимостей или что-то еще, вы можете создать BeanFactoryPostProcessor (не BeanPostProcessor ), который находит все определения бинов контроллера по типу или имени, затем ищет соответствующие определения bean-компонента валидатора по типу или имени и добавляет соответствующий валидатор в список свойств каждого bean-компонента контроллера. У меня нет примера кода для этого, но, надеюсь, вы поняли идею.