Почему вызов поля @Autowired внутри моего компонента возвращает ноль? - PullRequest
1 голос
/ 05 марта 2019

Я создал бин из класса Driver.При доступе к @Autowire полю wait внутри этого бина из его собственного метода все работает нормально, но когда я вызываю wait непосредственно внутри бина с driver.wait, я получаю NullPointerException.Может кто-нибудь объяснить, почему это происходит?

public class Driver{

    @Autowire 
    public MyWait wait;

    public void waitForIt(){
        this.wait.doStuff();
    }
}


@Component
@Lazy
public class MyWait{

    public void doStuff(){
        doingStuff();
    }
}


@Configuration
@Scope("cucumber-glue")
@ComponentScan(basePackages = {"utilities"})
@Lazy
public class SpringConfig {

    @Bean
    @Lazy
    public Driver getDriver() {
        return new Driver();
    }
}


@ContextConfiguration(classes = SpringConfig.class)
public Steps{

    @Autowire
    @Lazy
    Driver driver;

    public void waitForX(){
    driver.waitForIt(); <- works fine
    driver.wait.doStuff(); <- java.lang.NullPointerException on wait field
}

1 Ответ

1 голос
/ 05 марта 2019

Поскольку вы получаете доступ к полю driver.wait, используя ссылку на поле.Spring auto-wire основан на сгенерированных прокси, которые применяются к методам, особенно когда некоторые из bean-компонентов @Lazy.Согласно docs :

В дополнение к его роли для инициализации компонента, вы также можете разместить аннотацию @Lazy в точках впрыскивания, отмеченных @Autowired или @Inject.В этом контексте это приводит к внедрению прокси с отложенным разрешением.

Ниже должно работать, предполагая, что существует соответствующий getWait() метод:

driver.getWait().doStuff()
...