Spring - 自动装配时出现NullPointerException

时间:2013-12-09 12:03:27

标签: java spring

有没有办法直接从main方法运行由注释配置的Spring应用程序? 我仍然在下面运行NullPointerException运行代码。请注意,我没有使用SpringMVC,当我使用context.xml中定义的bean时,通过context.getBean方法在main方法中注入,所有代码都工作正常(没有错误) - 但我只是想知道它是否是一种方法管理仅使用注释运行吗?

//IElem.java
package com.pack.elem;
public interface IElem {
   public abstract String sayHello();
}



//Elem.java
package com.pack.elem;
import org.springframework.stereotype.Component;
@Component
public class Elem implements IElem{
   @Override
   public String sayHello() {
       return ("Hello from Elem class object");
   }
}


//RunElem.java
package com.pack.elem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class RunElem {
   @Autowired
   private IElem elem;

   public void runHello(){
      System.out.println(elem.sayHello());
   }
}


//Main.java
package com.pack.main;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.pack.elem.RunElem;

public class Main {
   @Autowired
   private RunElem runelem;

   public static void main(String[] args) {
       ApplicationContext context= new ClassPathXmlApplicationContext("/META-INF/application-context.xml");
    new Main().runRun();
   }

   private void runRun(){
      runelem.runHello();
   }
 }


<!--/META-INF/application-context.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">

   <context:annotation-config/>
   <context:component-scan base-package="com.pack"/>
</beans>

1 个答案:

答案 0 :(得分:2)

简单地说,Spring是自动装配的,如果它是实例化bean的那个。所以你必须使用getBean()。如果您只想使用注释,那么这样的事情应该有效:

@Component
public class Main {
   @Autowired
   private RunElem runelem;

   public static void main(String[] args) {
       ApplicationContext context= new ClassPathXmlApplicationContext("/META-INF/application-context.xml");
    Main mainBean = context.getBean(Main.class);
    mainBean.runRun();
   }

   private void runRun(){
      runelem.runHello();
   }
 }

或者,您可以自动装配现有bean,如下所示,但这不是推荐的Spring用法:

public class Main {
   @Autowired
   private RunElem runelem;

   public static void main(String[] args) {
       ApplicationContext context= new ClassPathXmlApplicationContext("/META-INF/application-context.xml");
    Main mainBean = new Main();
    context.getAutowireCapableBeanFactory().autowireBean(mainBean);
    mainBean.runRun();
   }

   private void runRun(){
      runelem.runHello();
   }
 }