Spring Bean Injection против Autowiring - PullRequest
15 голосов
/ 05 мая 2011

Насколько я понимаю, при использовании Dependency Injection все компоненты bean инициализируются при запуске.

<bean id="userPreferences" class="com.foo.UserPreferences">
  </bean>
  <!-- a singleton-scoped bean injected to the above bean -->
  <bean id="userService" class="com.foo.SimpleUserService">

      <!-- a reference to the userPreferences bean -->
      <property name="userPreferences" ref="userPreferences"/>
  </bean>

и приведенная выше конфигурация означает, что userService и userPreferences созданы при запуске приложения. Это правильно?

При использовании Autowiring и <context:component-scan>

public class SimpleUserService{

@Autowired
UserPreferences userPreferences;

//omitted
} 

1) Создается ли userPreference в приложении init?

2) Какова область по умолчанию для бобов, вводимых autowire, и как мы можем изменить это?

3) Как влияет создание бобов и инъекция бобов?

Надеюсь, я ясно дал понять.

Ответы [ 4 ]

12 голосов
/ 05 мая 2011

Прежде всего вы должны добавить @Service или @Component к классу SimpleUserService.

  • 1 Да, ОДИН экземпляр UserPreferences создается при инициализации приложения
  • 2 Область действия по умолчанию - singleton. Вы можете изменить ее с помощью аннотации @Scope (@See Spring Reference: 3.11.4.4 Указание области действия bean-компонента )
  • 3 Работа сканирования компонентов и конфигурации XML вТочно так же (жизненный цикл)

Возможно, вам следует потратить некоторое время на понимание жизненного цикла весны.Вы должны понимать, что Spring немного работает (не на 100% правильно):

  • сначала он создает пул бинов
  • , а затем вводит свойства в бины

Но это НЕ работает так: беря класс, посмотрите, какие ссылки ему нужны, создайте эти ссылки (рекурсивно), а затем создайте класс.

Если вы понимаете это, то вытакже поймет, что @Scope объекта определяется в объявлении / классе компонента, но не в ссылках.

4 голосов
/ 05 мая 2011

1) Создана ли userPreference на Приложение init?

В любом случае userPreferences инициализируется при загрузке Spring Context. Вы можете изменить это поведение, добавив lazy-init="true" к конфигурации компонента.

2) Какова область по умолчанию для бобов впрыскивается AutoWire и как мы можем изменить это?

Объем вводимой информации - все компоненты, загружаемые в Spring. Если вы импортируете конфигурацию XML из другого проекта, она тоже будет включена. Я не уверен, что вы можете ограничить свои возможности.

3) Как влияет на создание бобов и бобов инъекции

Независимо от того, подключен ли он автоматически или настроен через XML, поведение должно быть одинаковым Я предпочитаю явно определять зависимости, а не автоматические аннотации. С другой стороны, я также люблю строго типизированные языки.

3 голосов
/ 05 мая 2011

указанная выше конфигурация означает, что userService и userPreferences созданы при запуске приложения.Это правильно?

Да

Создана ли userPreference в приложении init?

Да

Чтоявляется областью по умолчанию для компонента, внедренного autowire, и как мы можем его изменить?

Область по умолчанию всегда "singleton".Это можно изменить, используя @Scope с @Bean или атрибут scope XML на <bean>.

Как влияет создание бинов и внедрение бинов?

Это не ясный вопрос.Если вы изменяете область действия компонента, вы изменяете его при создании (запуск приложения, каждый запрос, каждый сеанс и т. Д.).Конфигурация проводки остается прежней, меняется только жизненный цикл.

1 голос
/ 02 апреля 2017

Нотация @autowired - это устаревший способ сказать @inject. Последняя особенность JavaEE 6.

/ stackoverflow.com вопросы / 7142622 / что-это-разностного-между-Inject-и-autowired в пружине-каркасной которой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...