这是我的代码:
public class Main { public static void main(String[] args) { Main p = new Main(); p.start(args); } @Autowired private MyBean myBean; private void start(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/config.xml"); System.out.println("my beans method: " + myBean.getStr()); } } @Service public class MyBean { public String getStr() { return "string"; } }
<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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config /> <context:component-scan base-package="mypackage"/> </beans>
为什么不起作用?我懂了NullPointerException。在独立的应用程序中可以使用自动装配吗?
NullPointerException
Spring在独立应用程序中工作。您使用错误的方式来创建Spring bean。这样做的正确方法是:
@Component public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/config.xml"); Main p = context.getBean(Main.class); p.start(args); } @Autowired private MyBean myBean; private void start(String[] args) { System.out.println("my beans method: " + myBean.getStr()); } } @Service public class MyBean { public String getStr() { return "string"; } }
在第一种情况下(问题中的那个),您将自己创建对象,而不是从Spring上下文中获取对象。因此,Spring没有机会获得Autowire依赖关系(这会导致NullPointerException)。
Autowire
在第二种情况(此答案中的一种)中,您是从Spring上下文中获取bean的,因此它是Spring托管的,而Spring负责autowiring。
autowiring