在独立的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注入message
variables。 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
或其子包中。