在独立的Java应用程序中使用Spring 3自动assembly

这是我的代码:

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 。 是否可以在独立的应用程序中使用自动assembly?

Spring在独立应用程序中工作。 你用错误的方法来创build一个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"; } } 

在第一种情况下(在问题中),你自己创build对象,而不是从Spring上下文中获取它。 所以Spring没有得到Autowire依赖的机会(导致NullPointerException )。

在第二种情况下(在这个答案中的那个),你从Spring上下文获得bean,因此它是Springpipe理的,Spring负责autowiring

Spring正在离开XML文件并大量使用注释。 以下示例是一个简单的独立Spring应用程序,它使用注释而不是XML文件。

 package com.zetcode.bean; import org.springframework.stereotype.Component; @Component public class Message { private String message = "Hello there!"; public void setMessage(String message){ this.message = message; } public String getMessage(){ return message; } } 

这是一个简单的bean。 它用@Component注解来装饰,以供Spring容器自动检测。

 package com.zetcode.main; import com.zetcode.bean.Message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; @ComponentScan(basePackages = "com.zetcode") public class Application { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(Application.class); Application p = context.getBean(Application.class); p.start(); } @Autowired private Message message; private void start() { System.out.println("Message: " + message.getMessage()); } } 

这是主要的Application类。 @ComponentScan注释search组件。 @Autowired注释将bean注入messagevariables。 AnnotationConfigApplicationContext用于创buildSpring应用程序上下文。

My Standalone Spring教程展示了如何使用XML和注解创build一个独立的Spring应用程序。

对于Spring 4,使用Spring Boot,我们可以使用下面的示例,而不使用直接从ApplicationContext获取Bean的反模式:

 package com.yourproject; @SpringBootApplication public class TestBed implements CommandLineRunner { private MyService myService; @Autowired public TestBed(MyService myService){ this.myService = myService; } public static void main(String... args) { SpringApplication.run(TestBed.class, args); } @Override public void run(String... strings) throws Exception { System.out.println("myService: " + MyService ); } } @Service public class MyService{ public String getSomething() { return "something"; } } 

确保所有注入的服务都在com.yourproject或其子包中。