¿Cuándo no usar Spring para crear una instancia de un bean?

13

Estoy tratando de entender cuál sería el uso correcto de Spring. No sintácticamente, sino en términos de su propósito. Si uno está usando Spring, ¿debería el código Spring reemplazar todo el código de instanciación de bean? ¿Cuándo usar o cuándo no usar Spring, para instanciar un frijol?

El siguiente ejemplo de código puede ayudarlo a comprender mi dilema:

List<ClassA> caList = new ArrayList<ClassA>();
for (String name : nameList) {
    ClassA ca = new ClassA();
    ca.setName(name);
    caList.add(ca);
}

Si configuro Spring se convierte en algo así como:

List<ClassA> caList = new ArrayList<ClassA>();
for (String name : nameList) {
    ClassA ca = (ClassA)SomeContext.getBean(BeanLookupConstants.CLASS_A);
    ca.setName(name);
    caList.add(ca);
}

Personalmente, creo que usar Spring aquí es una sobrecarga innecesaria, porque

  1. El código más simple de leer / comprender.
  2. Realmente no es un buen lugar para la inyección de dependencia, ya que no espero que haya una implementación múltiple / variada de ClassA, que me gustaría reemplazar con la configuración de Spring en un momento posterior.

¿Estoy pensando correctamente? Si no, ¿a dónde me estoy yendo mal?

Rishabh
fuente

Respuestas:

14

Tienes razón, Spring no es apropiado para el caso de uso que mencionaste. Spring se usa mejor para administrar dependencias externas (como conectar una conexión JDBC a un DAO) o configuraciones (como especificar qué tipo de base de datos usar). En su ejemplo, si el tipo de bean puede cambiar, usaría una interfaz para especificar el bean e instanciaría los beans usando Factory. Usaría Spring para especificar qué fábrica usar e inyectarlo en la clase que necesitaba para instanciar los beans. Luego, podría tener varias fábricas diferentes que crearon varios tipos diferentes de beans (que todos admitían la interfaz de bean) y configurar el apropiado en el momento de la instalación (o actualización).

TMN
fuente
9

Usaría Spring (u otro sistema DI) entre capas, instanciación directa dentro de capas.
Entonces, una clase que crea un bean que deja el alcance de esa clase, a algún sistema externo (funcionalmente), posiblemente definido por ese sistema o alguna capa de comunicaciones, se crearía a través de DI. Otro bean creado exclusivamente para uso interno dentro de la capa de aplicación se crea directamente, por razones de claridad de código y (en sistemas grandes igual de importantes) por razones de rendimiento.

jwenting
fuente
¡Esta también es una respuesta válida para mí! Lamentablemente, solo puedo elegir una respuesta.
Rishabh
1

Si se trata de un frijol , se debe dejar que la primavera construirlo (excepto en que puede suministrar un grano de fábrica - He usado para que donde yo tenía que devolver una determinada subclase depende de una propiedad del sistema - y usted debe consultar la documentación en el @Configurationy @Beananotaciones si estás haciendo eso) Si no es un bean, sino más bien un simple objeto Java simple, no es necesario usar Spring para hacerlo. Los POJO son útiles, pero no recibirán inyección de dependencia, envoltorios de AOP, etc., ya que esas son las cosas que Spring agrega para usted.

La decisión fundamental es si es realmente un bean o no, o simplemente un objeto ordinario que sigue algunas convenciones de bean (por ejemplo, la denominación de métodos). No puedo adivinar cuál es realmente el caso del pequeño ejemplo que diste.

Compañeros de Donal
fuente
Hola Donal, ¿Su respuesta sería la misma si la Clase A es una clase de dominio que es rica en lógica de negocios?
Sameer Patil
0

Podría estar equivocado expertos por favor corrija.

Todo el concepto de Bean en el contexto de la primavera es que Spring Container se ocupa del objeto. Es nacimiento, es alcance, ciclo de vida, muerte, etc. Es como si fuera un cuidador del objeto. La aplicación que lo necesita lo inyecta.

Entonces, mientras toma una decisión durante el diseño de su módulo, siempre piense si desea que Spring Framework se encargue o si es un objeto simple cuyo ciclo de vida está incluido en un método.

Como se sugirió anteriormente, los objetos dao, los objetos de colas jms, etc.son pesados ​​y es mejor dejar que el experto que es Spring Framework se encargue de ello.

Rahul Joshi
fuente