Простой вопрос по Spring (Java-based configuration)

Рейтинг: 0Ответов: 1Опубликовано: 23.12.2014

Учу конфигурацию на основе java кода. В данный момент получился вот такой код:

@Autowired
@Bean(name = "validator")
public LocalValidatorFactoryBean getLocalValidatorFactoryBean(MessageSource source) {
    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
    validator.setValidationMessageSource(source);
    return validator;
}

@Override
public Validator getValidator() {
    return .. // нужно вернуть бин "validator"
}

Что делать дальше? Я могу там написать return getLocalValidatorFactoryBean(), но тогда в скобках придётся указывать messageSource, то есть получается длинная цепочка из зависимостей, что противоречит идеологии Spring. Дописывать аргумент в метод getValidator (чтобы использовать @Autowired) тоже не круто, потому что тогда получится перегрузка метода (overload), а не переопределение (override).

То есть как бы аналог такой xml-конфигурации:

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages"/>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource" />
    </bean>

    <mvc:annotation-driven validator="validator"/>

Тут я могу дальше в любом месте обращаться к валидатору по id, не таща за собой цепочку его зависимостей.

Ответы

▲ 1Принят

Зачем определять бин отдельно в методе getLocalValidatorFactoryBean()? Создавайте его в getValidator() и будет меньше лишнего кода и проблем. Если вам при создании понадобится MessageSource, то либо а) создавайте его там же (если нигде больше не нужен) б) объявите член класса типа MessageSource и инжектите его через @Autowired.

(Сам я пошел по пути а.)