Порядок, в котором поля в бине инициализируются
У меня есть такой боб:
@Component
@DependsOn("SomeType")
Class A{
@Autowired
SomeType one;
String two = one.someMethod();
int three;
}
In my application context xml, I have:
<bean id="two" class="a.b.c.SomeType"></bean>
<context:component-scan base-package="a.b.c"/>
<context:annotation-config/>
Но пока Spring создает экземпляр боба, он бросает NullPointerException
, Так что мне интересно, если поле two
инициализируется перед полем one
, вызывая NPE. Может кто-нибудь сказать мне, в каком порядке поля инициализируются в бобе?
2 ответа
Твой класс A
объявление составлено в это:
class A {
@Autowired
SomeType one;
String two;
int three;
public A() {
this.two = one.someMethod();
}
}
Поэтому, когда Spring создает экземпляр A
внедрить экземпляр SomeType
в это он называет A
по умолчанию конструктор и, следовательно, вы получите NPE
,
Сначала я должен сказать, что String two = one.someMethod();
эта строка кода очень и очень плохая. Тогда позвольте мне объяснить, как происходит NPE. Когда Spring запускает bean-компоненты, сначала выполняется bean-компонент: A
затем попробуйте связать поле one
в данный момент компонент SomeType компонента не может быть создан, поэтому Sping пометит его как await to instant
а затем продолжает связывать другое поле, он переходит к мгновенному two
, то вызывают проблемы.