Java Spring应用程序@autowired返回空指针异常

时间:2016-03-18 13:02:33

标签: java spring

我是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的正确方法是什么?任何更清楚的解释都会非常感激。

5 个答案:

答案 0 :(得分:8)

只有Spring管理的bean可以有@Autowire个注释。你的主要类不是由Spring管理的:它是由你创建的,而不是在Spring上下文中声明的:Spring对你的类没有任何了解,也没有注入这个属性。

您只需使用以下命令在主方法中访问Test bean:

context.getBean(Test.class).Print();

通常,你得到一个&#34; bootstrap&#34;从上下文中,并调用此引导程序来启动您的应用程序。

此外:

  • 在Java上,方法不应该以大写字母开头。您的测试类应采用print方法,而不是Print
  • 如果你从Spring开始,你应该尝试Spring Boot

答案 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();
     }

}