11

Tengo una aplicación web con resorte 3.0. Necesito ejecutar una clase con el método principal de un cron que usa beans definidos en appcontext xml (usando annocations de exploración de componentes). Tengo mi clase principal en el mismo directorio src. ¿Cómo puedo inyectar frijoles desde el contexto web en el método principal? Traté de hacerlo utilizandoinyección de Spring Bean en un método principal clase

ApplicationContext context = new ClassPathXmlApplicationContext("appservlet.xml"); 

He intentado utilizar AutoWired y devuelve un grano nula. Entonces usé Application ctx y esto está creando un nuevo contexto (como se esperaba) cuando ejecuto el método principal. Pero es posible que pueda usar beans existentes del contenedor.

@Autowired 
static DAO dao; 

    public static void main(String[] args) { 
       ApplicationContext context = new ClassPathXmlApplicationContext("xman-   servlet.xml"); 
    TableClient client = context.getBean(TableClient.class); 
    client.start(context); 

} 
+1

Para lectores futuros, una pregunta estrechamente relacionada: http://stackoverflow.com/questions/3659720/spring-3-autowire-in-standalone-application – Jonik

Respuesta

1

Puede utilizar un contexto de primavera para su aplicación principal, y reutilizar los mismos frijoles como la aplicación web. Incluso podría reutilizar algunos archivos de configuración de Spring XML, siempre que no definan beans que solo tienen sentido en un contexto de aplicación web (ámbito de solicitud, controladores web, etc.).

Pero obtendrá diferentes instancias, ya que tendrá dos JVM en ejecución. Si realmente desea reutilizar las mismas instancias de beans, su clase principal debería llamar remotamente algún método de un bean en su aplicación web, utilizando un servicio web o HttpInvoker.

4

No se puede inyectar un Spring Bean en ningún objeto que no haya sido creado por la primavera. Otra forma de decir eso es: Spring solo puede inyectar en los objetos que administra.

Dado que está creando el contexto, deberá llamar a getBean para su objeto DAO.

Echa un vistazo Spring Batch te puede ser útil.

2

intento con esta principal:

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("classpath*:/META-INF/spring/applicationContext*.xml"); 
     System.out.println("The method of my Bean: " + myBean.getStr()); 
    } 
} 

Y este Bean:

@Service 
public class MyBean { 
    public String getStr() { 
     return "mybean!"; 
    } 
} 
1

arranque Spring proporciona una solución oficial para este. Descargar un esqueleto de

https://start.spring.io/

y asegúrese de que los envases en el pom.xml se establece en el tarro. Siempre que no incluya ninguna dependencia web, la aplicación seguirá siendo una aplicación de consola.

Cuestiones relacionadas