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

У меня есть боб:

    
        
        
        
    

  
    
  

documentLogic,stateAccess а такжеcontextAccess поля наBasketLogicImpl

А у меня нету

EfcoBasketLogic.java:

public class EfcoBasketLogic extends BasketLogicImpl {

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

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

Ответы на вопрос(3)

Решение Вопроса

Вы должны использовать установщик, потому что аннотации не обнаруживаются, если пружина не сообщается об этом либо через или же, Сеттер обнаружен, потому что вы указали.autowire="byType"

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

 GarfieldKlon02 нояб. 2012 г., 13:57
Даже если я явно введу этот бин через?
 GarfieldKlon02 нояб. 2012 г., 15:52
Хорошо, но зачем мне писать сеттер, если ям, используя autowire = "ByType» и аннотировал поле с помощью @Inject? Это предназначено, путь? Я имею в виду, что могу выбросить сеттер, если буду использовать annotation-config. Так что есть разница между этим и autowire = "ByType "?
 mrembisz02 нояб. 2012 г., 14:13
Я рекомендую задать еще один вопрос. Я ответил на ваш оригинальный вопрос и не могу понять, чтоВаша следующая проблема без более подробного описания, включая некоторый код или XML.
 mrembisz02 нояб. 2012 г., 18:22
Автопроводка обнаруживает сеттеры и параметры конструктора как потенциальные зависимости. Не частные поля. Аннотации невидимы, если вы не требуете их проверки.
 GarfieldKlon02 нояб. 2012 г., 14:37
Мой вопрос был, почему я должен написать сеттер (когда яЯ не использую компонентное сканирование или аннотацию-конфигурацию).
 mrembisz02 нояб. 2012 г., 14:52
Перефразируя мой ответ, может быть, теперь это будет более понятным.
 GarfieldKlon02 нояб. 2012 г., 12:37
Если я это сделаю, появится новая проблема -> Не определено ни одного уникального компонента типа [xyz]: ожидаемый единственный соответствующий компонент, но найден 5, Тот's вызван другим бином, где я явно внедряю свойство через и есть 5 бинов, которые реализуют этот интерфейс. Свойство "х" имеет аннотацию @Inject. Таким образом, кажется, что явное определение не переопределяет вещи с автопроводкой?
 mrembisz02 нояб. 2012 г., 13:35
@Inject будет решен правильно, если есть только один компонент данного типа или один, помеченный как основной. Если у вас есть несколько сменных bean-компонентов этого типа, вам нужно ввести их по имени, используя@Resource или XML.

Насколько я понимаю, конфигурация XML переопределяет конфигурацию аннотаций. Тот факт, что autowire = "ByType» указанный переопределяет автоматическое внедрение, которое ищет наличие метода установки для внедрения зависимости.

Прежде всего, использование или же позволяет Spring сканировать ваш код на предмет соответствия bean-компонентам зависимостей, что значительно улучшит его »Возможность их правильного подключения, поэтому я предлагаю добавить их в ваш контекстный файл.

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

Но чтобы прямо ответить на ваш вопросЗачем мне нужен сеттер, когда не используется компонентное сканирование?, являетсятак как Вы не используете компонентное сканирование. Вы просите Spring ввести зависимостьByType», но не позволяет Spring сканировать ваш код на наличие компонентов этого типа. Причина того, что установщик работает, заключается в том, что тип вводимого аргумента установщика может быть обнаружен Spring в скомпилированном байт-коде (то есть метаданных), и поэтому он успешно разрешает ваш запрос.

 pmhargis03 сент. 2013 г., 21:18
К вашему сведению: при использовании `<контекст: компонент-сканирование /> `, убедитесь, что вы установили атрибут base-package в корне иерархии классов, в которой объявлены классы bean-компонентов (через @Named или @Autowired). Например: <бобы>     <context: component-scan base-package = "org.example "/> </ бобы>

Ваш ответ на вопрос