Зачем нужен установщик для поля с автоподзаводом/вводом?

У меня есть bean:

    <bean id="BasketLogic" class="efco.logic.EfcoBasketLogic" autowire="byType">
        <property name="documentLogic" ref="DocumentLogic" />
        <property name="stateAccess" ref="StateAccess" />
        <property name="contextAccess" ref="ContextAccess" />
    </bean>

  <bean id="EfcoErpService" autowire="byType" class="efco.erp.service.EfcoErpServiceImpl">
    <constructor-arg ref="ErpConnector"/>
  </bean>

documentLogic, stateAccess и contextAccess - это поля в BasketLogicImpl

И у меня нет <context:component-scan />

EfcoBasketLogic.java:

public class EfcoBasketLogic extends BasketLogicImpl {

        @Inject
        private EfcoErpService erpService;
    ...
    ...
    ...
}

erpService имеет значение null, если я не предоставил сеттер. Но почему? Я думал, что сеттер не нужен там, где происходит аутсорсинг? Может быть, что BasketLogicImpl отвечает за это?

Ответ 1

Вам нужно использовать сеттер, потому что аннотации не обнаружены, если только spring не передается через <context:component-scan /> или <context:annotation-config />. Setter обнаружен, потому что вы указали autowire="byType".

Вы также можете найти этот вопрос и ответ: Когда использовать autwiring в Spring

Ответ 2

Прежде всего, использование <context:component-scan /> или <context:annotation-config /> позволяет Spring проверять ваш код на подходящий beans для соответствия зависимостям, что значительно улучшит его способность правильно подключать их, поэтому я предлагаю добавить их в ваш файл контекста.

Во-вторых, вы должны знать, что @Inject - это стандартная (означая спецификацию JSR-330). Это нормально смешивать и сопоставлять аннотации Spring со стандартными, но при этом может измениться поведение. @Named обычно сопрягается с @Inject для соответствия компонентам с зависимостями (как JSR-330). Подробнее см. reference и обратитесь к таблице 4.6 для комментариев к использованию.

Но для прямого ответа на ваш вопрос "почему мне нужен сеттер, если вы не используете компонентное сканирование", это потому, что вы не используете компонентное сканирование. Вы запрашиваете Spring для ввода зависимости "byType", но не позволяете Spring сканировать код для компонентов такого типа. Причина, по которой работает сеттер, заключается в том, что тип вводимого аргумента setter может быть обнаружен Spring в скомпилированном байт-коде (т.е. Метаданные), и поэтому он успешно разрешает ваш запрос.

Ответ 3

Я понимаю, что конфигурация XML переопределяет конфигурацию аннотаций. Тот факт, что autowire = "byType" указан, переопределяет автоматическую инъекцию, которая ищет наличие метода setter для инъекции зависимости.