1 回答

TA貢獻2011條經驗 獲得超2個贊
我認為這是因為 Spring 將首先必須實例化您的SomeBean類,然后它將嘗試FirstBean通過反射自動裝配,因為您@Autowired在字段上放置了注釋。
您正在嘗試訪問構造函數中的FirstBean依賴項,但是當調用SomeBean構造函數時,在創建上下文時,依賴項為空,因為 Spring 尚未自動裝配依賴項 - 它會在對象創建后嘗試通過反射自動裝配它。這就是你到達那里的原因。你的班級也會發生同樣的情況——決定一種方法。SomeBeanFirstBeanNullPointerExceptionSomeBean
此外,奇怪的是,您創建的類都用@Configuration和進行了注釋@Component。請參閱此 SO 問題以查看潛在錯誤。
此外,您的配置中存在一些問題。您使用注釋FirstBean進行@Component注釋,并且您仍然創建了一個@Bean返回此類實例的帶注釋的方法。您應該決定一種方法 - 您使用注釋為應用程序上下文實例化它,@Bean或者使用注釋此類,@Component然后讓組件掃描自動為您創建它。
編輯:
您應該決定是要使用@ComponentScan還是要通過@Bean注釋為上下文創建 bean - 現在您正在混合不同的類型,并且在嘗試按類型自動裝配時會因重復的 bean 定義而出錯,因為在您當前的實現中會有在您的上下文中是 2 個 beanSomeBean和 2 個 bean FirstBean- 它們只會有不同的 ID。請注意,我用 NPE 期望指出的錯誤與它無關。我將提出一個使用自動包掃描的解決方案:
FirstBean類
@Component
public class FirstBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "FirstBean [name=" + name + "]";
}
}
SomeBean類
@Component
public class SomeBean {
private FirstBean fb;
@Autowired
public SomeBean(FirstBean firstBean) {
this.fb = firstBean;
this.fb.setName("Some Name");
}
public void print() {
this.fb.toString();
}
}
我的配置類
@Configuration
@ComponentScan(basePackages = { "com.example" })
public class MyConfig {
}
主驅動類
@Component
public class MainDriver {
@Autowired
private Environment env;
@Autowired
protected ConfigurableEnvironment cenv;
@Autowired
ApplicationContext ctx;
@Autowired
private SomeBean sb;
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
MainDriver l = ctx.getBean(MainDriver.class);
System.out.println("In main() the ctx is " + ctx);
l.test();
}
public void test() {
System.out.println("hello");
sb.print();
}
}
添加回答
舉報