为什么调用我的 bean 中的 @Autowired 字段 returns null?

Why call to @Autowired field inside my bean returns null?

我从 class Driver 创建了一个 bean。当从它自己的方法访问该 bean 内部的 @Autowire 字段 wait 时,一切正常,但是当我使用 driver.wait 直接在 bean 内部调用 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
}

因为您正在使用字段引用访问 driver.wait 字段。 Spring auto-wire 基于生成的应用于方法的代理,尤其是当某些 bean 是 @Lazy 时。根据 docs:

In addition to its role for component initialization, you can also place the @Lazy annotation on injection points marked with @Autowired or @Inject. In this context, it leads to the injection of a lazy-resolution proxy.

假设有相应的 getWait() 方法,下面应该可以工作:

driver.getWait().doStuff()