Soy un usuario final de uno de mis productos de la empresa. No es muy adecuado para la integración en la Primavera, sin embargo soy capaz de conseguir una manija en el contexto y recuperar la necesaria bean por su nombre. Sin embargo, todavía me gustaría saber si es posible inyectar un bean en esta clase, aunque la clase no es gestionado por la propia Spring.

Aclaración: La misma aplicación que es la gestión del ciclo de vida de la clase Miclase, es que la gestión del ciclo de vida de la Primavera contexto. La primavera no tiene ningún conocimiento de la instancia de Miclase, y me gustaría algo de la forma de proporcionar la instancia para el contexto, pero no puede crear la instancia en el contexto de la misma.

  • Por favor aclarar: Usted desea inyectar el grano a través de la Configuración del Resorte, el Resorte de forma dinámica en tiempo de ejecución, o mediante programación a través de un setter?
  • Cualquier método es bueno. El punto es que la aplicación se ha creado el objeto en el que quiero inyectar un bean, por lo que el objeto original no es gestionado por el contexto de la Primavera.
  • También, considere el uso de un método de fábrica de modo que usted puede poner la clase en el contexto de la aplicación y configurar según una normal de Primavera bean. Buscar en la Primavera de referencia docs respecto de frijol de las fábricas.
  • No estoy seguro de cómo un método de fábrica tendría más acceso a un bean no gestionados por el contexto de la Primavera, que es el punto de la cuestión.

7 Comentarios

  1. 57

    Usted puede hacer esto:

    ApplicationContext ctx = ...
    YourClass someBeanNotCreatedBySpring = ...
    ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
        someBeanNotCreatedBySpring,
        AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);

    Puede utilizar @Autowired y así sucesivamente dentro de YourClass para especificar los campos para ser inyectado etc.

    • Nunca tuve la oportunidad de probar este, pero parece que viene el más cercano a lo que yo estaba buscando. Sería bueno darle un giro.
    • Este respuesta, se explica cómo obtener la ApplicationContext
  2. 2

    Una manera de traer a un frijol en la Primavera, a pesar de su fabricación, siendo externo es el uso de una clase auxiliar marcado como un @Configuration bean que tiene un método (marcado con @Bean) que en realidad hace la instancia y las manos de ella a través de la Primavera (que no son de su propiedad y de inyección de generación de proxy en ese punto).

    No estoy muy seguro de qué ámbito se necesita; con prototype, usted obtendrá un frijol fresco en cada lugar.

    @Configuration
    public class FooBarMaker {
        @Bean(autowire = Autowire.BY_TYPE)
        @Scope("prototype")
        public FooBar makeAFooBar() {
            //You probably need to do some more work in here, I imagine
            return new FooBar();
        }
    }

    Puede inyectar propiedades requeridas para la fabricación en la @Configuration bean. (Yo uso este para crear instancias de una interfaz donde el nombre de la clase a instanciar se define en tiempo de ejecución).

  3. 2

    supongamos que u tiene la siguiente cadena de dependencias:

    Un –> B –> C –> x –> y — > Z

    A, B, C son la primavera managed beans (construidas y manejadas por el framework spring)
    x, y son muy simples POJOs que construye su aplicación, sin primavera asistencia

    ahora si quieres que y va a obtener una referencia a Z mediante la primavera que usted necesita para tener una «manija» a la primavera ApplicationContext

    una manera de hacerlo es aplicar ApplicationContextAware de la interfaz . En este caso me atrevería a sugerir que, ya sea a, B o C se implemente esta interfaz y se va a almacenar el applicationContext de referencia en un miembro estático.

    así que vamos a echar de Clase C, por ejemplo:

    class C implmenets ApplicationContextAware{
        public static ApplicationContex ac;
         void setApplicationContext(ApplicationContext applicationContext)  {
                   ac = applicationContext;
         }
     .............
    }

    ahora, en clase y usted debe tener:

    (Z)(C.ac.getBean("classZ")).doSomething()

    HTH — Yonatan

    • Cómo acerca de: x e y no depende de C, y quiero inyectar Z en x o y? Parece que tendría que utilizar el @Comparable etiqueta en la primavera de contexto, a continuación, hacer algo de tiempo de ejecución de tejido después del hecho. Hasta ahora no he conseguido que funcione, y añade extra de trabajo. Buscando una manera más fácil.
    • Esto es francamente feo
    • Se establece el ‘ac’ (la cual es estática) de ‘setApplicationContext el método de la cual no es estática. Idealmente, los campos estáticos, sólo se actualizan desde sincronizado métodos estáticos. De lo contrario, esto podría fácilmente conducir a errores si hay varias instancias de la clase y/o de múltiples hilos en el juego.
  4. 0

    Si quieres crear un objeto fuera la Primavera contexto, y hacer que el objeto esté disponible para la inyección en otros granos que son en el contexto de la Primavera, puede seguir los pasos en este artículo.

    Básicamente, se crea un padre de familia en el contexto de aplicación y empuje de su objeto externo en esta padre el contexto como un singleton. A continuación, cree usted contexto principal de la aplicación (por ejemplo, a partir de archivos xml), con el padre en el contexto de aplicación como su padre.

    Object externalObject = ...
    GenericApplicationContext parent = new StaticApplicationContext();
    parent.getBeanFactory().registerSingleton( "externalObject", externalObject );
    parent.refresh();
    ApplicationContext appContext = new ClassPathXmlApplicationContext( ... , parent);

Dejar respuesta

Please enter your comment!
Please enter your name here