Usando Spring 3 autowire en una aplicación Java independiente

Aquí está mi código:

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"; } } 

     

¿Por qué esto no funciona? Obtengo NullPointerException . ¿Es posible utilizar el autoenvío en una aplicación independiente?

Spring funciona en una aplicación independiente. Estás usando la forma incorrecta para crear un bean de spring. La forma correcta de hacerlo así:

 @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"; } } 

En el primer caso (el de la pregunta), estás creando el objeto por ti mismo, en lugar de obtenerlo del contexto de Spring. Por lo tanto, Spring no tiene la posibilidad de realizar un Autowire las dependencias (lo que causa la NullPointerException ).

En el segundo caso (el de esta respuesta), obtienes el bean del contexto de Spring y, por lo tanto, es administrado por Spring y Spring se ocupa del autowiring .

Spring se está alejando de los archivos XML y usa anotaciones en gran medida. El siguiente ejemplo es una aplicación Spring simple e independiente que utiliza anotaciones en lugar de archivos 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; } } 

Este es un simple frijol Está decorado con la anotación @Component para autodetección en contenedor 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()); } } 

Esta es la clase de Application principal. La anotación @ComponentScan busca componentes. La anotación @Autowired inyecta el bean en la variable de message . El AnnotationConfigApplicationContext se usa para crear el contexto de la aplicación Spring.

Mi tutorial Standalone Spring muestra cómo crear una aplicación de Spring independiente con XML y anotaciones.

Para Spring 4, usando Spring Boot podemos tener el siguiente ejemplo sin usar el patrón anti para obtener el Bean directamente de ApplicationContext:

 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"; } } 

Asegúrese de que todos sus servicios inyectados estén bajo com.yourproject o sus subpaquetes.