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

У меня есть такой боб:

@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, то вызывают проблемы.

Другие вопросы по тегам