время компиляции и автоматическое соединение на конструкторе - PullRequest
1 голос
/ 11 января 2011
@Configurable
public TestClass(){

@Autowired SomeOtherClass otherClass;

public TestClass(Var1 var){

System.out.println(otherClass);

}


}

Я использую время компиляции и вызываю new testClass(var). я использовал внедрение зависимости от конструктора, как указано выше «otherClass». Он распечатал «ноль». Из моего теста внедрение зависимости 'otherClass' не может быть инициализировано в конструкторе. Что я должен сделать, чтобы разрешить внедрение зависимости от "конструктора"?

Ответы [ 3 ]

1 голос
/ 09 апреля 2013

Посмотрите примечание в этом разделе документации Spring.

Он показывает вам атрибут @Configurable, который будет использоваться для принудительного внедрения кода перед кодом в конструкторе.

@Configurable(preConstruction=true)

Добавление этого атрибута в ваш код выше остановит System.out.println(otherClass); от null.

0 голосов
/ 11 января 2011

В поддержку ответа Ральфа.

Из источника Документация с автопроводкой .

Поля вводятся сразу после создания компонента, перед любымВызываются методы конфигурации.

HTH

0 голосов
/ 11 января 2011

Полагаю (но не знаю на 100%), что автоподключение происходит после создания объекта.( Я имею в виду, что знаю это для обычных Spring Beans, для обычных классов, но не для 100% для @ Configurable )

Это означает, что вы не можете ожидать, что поле Autowired уже заполнено, когдаобъект создан.

Вы можете проверить это, если добавите второй метод printStats, который вызывается после создания.

public class TestClass {
  ...
   public void printStats(){
     System.out.println(otherClass);
   }
}

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