2013-06-18 3 views
4

Может ли кто-нибудь объяснить, почему объект @Inject имеет значение null, когда его класс инициализирован оператором new?Inject не работает с новым оператором

public class A{ 
    @Inject 
    B b; 
    ... 
    ... 
} 

Когда выше класс создается как A a = new A(); я b как null. Может ли кто-нибудь объяснить, почему? Я знаю, что это работает, когда я внедряю класс А. Но я хочу знать, почему он не работает с новым оператором. Что делает весна?

+0

У вас есть консервная банка, которая может быть автоподготовлена ​​в этом поле? Вы активировали сканирование компонентов? –

+0

A (tl; dr): Вы должны создать экземпляр из контейнера Spring (т. Е. Из «ApplicationContext») вместо «new». – Spoike

ответ

6

Инъекция зависимостях обрабатывается яровой контейнера, которые создаются в контейнере таким образом только объекты будут подвергнуты ему

В этом случае вы создаете объект вручную с помощью new оператора, весной контейнер не будет знать, о создании объекта.

Возможным решением является использование @Configurable аннотацию (и AspectJ), чтобы решить эту проблему, как указано в documentation

Также взгляните на this answer

+0

Это не на 100% правильное. Spring предоставляет функции вставки @Configurable Annotation (и AspectJ) даже для экземпляров, созданных «новым». – Ralph

+0

@Ralph Я думаю, вы говорите о http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable Я видел это, но думал, что это было более легко –

+0

@A запустить P Джонни: да. Дело в том, что длинные высказывания, которые сформулированы как абсолютная истина, без намека на то, что есть другие способы, могут нанести вред в долгосрочной перспективе. – Ralph

0

Каким образом инжектор должен замечать и действовать на new? Это языковая операция, которую нельзя перехватить.

0

B будет впрыскивается в Bean создает ту весну.

A a = new A(); 

Это не создано весной, это не фасоль.

В вашем контексте.xml вам необходимо создать Bean типа A и использовать его.

4

Весна не имеет возможности автоподключить зависимости в компонентах, которые она не создает. Инъекция зависимостей должна обрабатываться контейнером Spring. Если вы используете new для создания объектов, вы вообще не используете контейнер Spring. Вместо создания экземпляра вы должны запросить контейнер для объектов. Таким образом, контейнер будет иметь привязку к жизненному циклу этого объекта.

A a = new A(); 

Таким образом, ваш объект ссылается a не управляется Spring. Следовательно, он не сможет вставлять любые зависимые объекты в a.

Вы должны получить экземпляр A из контейнера, примерно так:

ClassPathXmlApplicationContext context = 
      new ClassPathXmlApplicationContext("applicationContext.xml"); 
A a = context.getBean("myBean"); 

P.S: - Хотя из контекста, но этот блог to-new-or-not-to-new хороший читать.

0

Несмотря на то, что это похоже на то, что инъекция не так уж и волшебна. Если вы создаете экземпляр с «новым», все, что происходит, это то, что вызывается конструктор и обрабатывается код в конструкторе.

Как получить экземпляр класса с введенными значениями зависит от технологии, которую вы используете.

0

static access to entity manager in spring and unusual architecture (Может кто-то переместить эту ссылку на последний абзац пожалуйста. С моим телефоном это невозможно мимо него в нужном месте)

Добавить @Configurable к классу. Тогда Spring будет платить инъекции в этот класс, даже если он создан с нормальным новым.

Но для этого требуется реальный AspectJ.

Подробнее см. Этот вопрос и ответ (ссылка в начале).

Смежные вопросы