我是Java Spring IoC的新手,这是我的问题
我有一个FactoryConfig类,其中包含所有bean和注释@Configuration和@ComponentScan,如下所示。
import org.springframwork.*
@Configuration
@ComponentScan(basePackages="package.name")
public class FactoryConfig {
public FactoryConfig() {
}
@Bean
public Test test(){
return new Test();
}
//And few more @Bean's
}
My Test类有一个简单的Print方法
public class Test {
public void Print() {
System.out.println("Hello Test");
}
}
现在在我的Main Class中我创建了一个FactoryConfig的ApplicationContentext。 (我希望我的所有@Beans都在Factory配置中初始化。但是,当我使用@Autowired访问Test类时它返回null
我的主要课程
public class Main {
@Autowired
protected static Test _autoTest;
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ApplicationContext context =
new AnnotationConfigApplicationContext(FactoryConfig.class);
FactoryConfig config = context.getBean(FactoryConfig.class);
config.test().Print();
// _autoTest.Print(); <--- Im getting NULL Pointer Ex here
}
}
@Autowire和使用对象/ bean的正确方法是什么?任何更清楚的解释都会非常感激。
答案 0 :(得分:8)
只有Spring管理的bean可以有@Autowire
个注释。你的主要类不是由Spring管理的:它是由你创建的,而不是在Spring上下文中声明的:Spring对你的类没有任何了解,也没有注入这个属性。
您只需使用以下命令在主方法中访问Test bean:
context.getBean(Test.class).Print();
通常,你得到一个&#34; bootstrap&#34;从上下文中,并调用此引导程序来启动您的应用程序。
此外:
print
方法,而不是Print
。答案 1 :(得分:0)
Spring不管理您的Main类,这就是您获得Nullpointer异常的原因。 使用ApplicationContext加载bean,您可以像以前一样获取bean和访问方法 -
ApplicationContext context =
new AnnotationConfigApplicationContext(FactoryConfig.class);
FactoryConfig config = context.getBean(FactoryConfig.class);
config.test().Print();
答案 2 :(得分:0)
删除静态参数 protected Test _autoTest;
答案 3 :(得分:-1)
你的班级
public class Test {
public void Print() {
System.out.println("Hello Test");
}
}
春天看不到。尝试为其添加适当的注释,例如 @Component 。
答案 4 :(得分:-1)
原因是您的Main
不是由Spring管理的。在配置中将其添加为bean:
import org.springframwork.*
@Configuration
@ComponentScan(basePackages="package.name")
public class FactoryConfig {
public FactoryConfig() {
}
@Bean
public Test test(){
return new Test();
}
@Bean
public Main main(){
return new Main();
}
//And few more @Bean's
}
然后您可以按如下方式修改main()
:
public class Main {
@Autowired
protected Test _autoTest;
public static void main(String[] args) throws InterruptedException {
ApplicationContext context =
new AnnotationConfigApplicationContext(FactoryConfig.class);
Test test = context.getBean(Test.class);
Main main = context.getBean(Main.class);
test.Print();
main._autoTest.Print();
}
}