我对于Spring 2.5之后引入的Annotation Driven Spring相当新。我对基于XML的配置感到相当满意,并且我从来没有遇到过使用XMl加载Spring容器的方法将bean转换为AutoWire的问题。在XML世界里,事情真是太酷了,但后来我转向了Annotation Ville,现在我对这里的人提出了一个简单的问题:为什么我的bean不会自动装配?这里是我有的课程创建:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.myspringapp.MyBean;
import com.myspringapp.MySpringAppConfig;
public class TestConfig {
@Autowired
private static MyBean myBean;
public static void main(String[] args) {
new AnnotationConfigApplicationContext(MySpringAppConfig.class);
System.out.println(myBean.getString());
}
}
以上是调用AnnotationConfigApplicationContext类的标准java类。我的印象是,一旦加载了“MySpringAppConfig”类,我将引用myBean aurowired属性,因此可以在其上调用getString方法。但是,我总是得到null,因此NullPointerException。
package com.myspringapp;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
public String getString() {
return "Hello World";
}
}
上面是组件MyBean,它很容易理解,下面是Configuration类:
package com.myspringapp;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MySpringAppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
注意:如果我使用(MyBean)ctx.getBean(“myBean”),我可以获得对bean的引用;但我不想使用getBean方法。
答案 0 :(得分:1)
我知道的唯一方法是自动装配静态字段是使用setter。但是这也不适用于你的情况,因为Spring需要处理对象,但是TestConfig
类没有在你的代码中处理。如果要将依赖项注入TestConfig
,可以将其定义为bean:
public class MySpringAppConfig {
@Bean
public TestConfig testConfig() {
return new TestConfig();
}
.....
然后通过:
获取TestConfig tc = (TestConfig) ctx.getBean("testConfig");
然后Spring可以使用setter方法注入myBean
。