为什么调用我的 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()
我从 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()