[英]Java Spring application @autowired returns null pointer exception
我對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
}
我的Test類有一個簡單的Print方法
public class Test {
public void Print() {
System.out.println("Hello Test");
}
}
現在,在我的主類中,Ive創建了FactoryConfig的ApplicationContentext。 (我期望工廠配置中的所有@Beans都將被初始化。但是,當我使用@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的正確方法是什么? 任何更清晰的解釋將不勝感激。
只有Spring管理的bean才能具有@Autowire
注釋。 您的主類不是由Spring管理的:它是由您創建的,並且未在Spring上下文中聲明:Spring對您的類一無所知,並且不會注入該屬性。
您可以使用以下方法在主要方法中訪問Test bean:
context.getBean(Test.class).Print();
通常,您會從上下文中獲得一個“引導程序”,並調用該引導程序來啟動您的應用程序。
此外:
print
方法,而不是Print
。 Spring不管理您的Main類,這就是為什么您得到Nullpointer Exception的原因。 使用ApplicationContext加載bean,您可以像已經做的那樣獲取bean和訪問Methods-
ApplicationContext context =
new AnnotationConfigApplicationContext(FactoryConfig.class);
FactoryConfig config = context.getBean(FactoryConfig.class);
config.test().Print();
刪除受保護的靜態參數Test _autoTest;
你的班
public class Test {
public void Print() {
System.out.println("Hello Test");
}
}
對Spring不可見。 嘗試向其添加適當的注釋,例如@Component 。
原因是您的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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.