Pregunta ¿Para qué sirve exactamente Spring Framework? [cerrado]


Escuché mucho sobre Primavera, la gente dice en toda la web que Spring es un buen marco para el desarrollo web. ¿Para qué sirve exactamente Spring Framework? ¿Cómo puedo usarlo para mi desarrollo de aplicaciones Web-Java? algún ejemplo?


524
2018-06-30 04:25


origen


Respuestas:


Básicamente, Spring es un marco para  que es un patrón que permite construir sistemas muy desacoplados.

El problema

Por ejemplo, supongamos que necesita listar a los usuarios del sistema y declarar una interfaz llamada UserLister:

public interface UserLister {
    List<User> getUsers();
}

Y tal vez una implementación accediendo a una base de datos para obtener todos los usuarios:

public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

En su opinión, tendrá que acceder a una instancia (solo un ejemplo, recuerde):

public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> users = userLister.getUsers();
        view.render(users);
    }
}

Tenga en cuenta que el código anterior no ha inicializado la variable userLister. ¿Qué debemos hacer? Si instanciamos explícitamente el objeto de esta manera:

UserLister userLister = new UserListerDB();

... Me gustaría combinar la vista con mi implementación de la clase que accede a la base de datos. ¿Qué pasa si quiero pasar de la implementación de DB a otra que obtiene la lista de usuarios de un archivo separado por comas (recuerde, es un ejemplo)? En ese caso, iría a mi código nuevamente y cambiaría la última línea por:

UserLister userLister = new UserListerCommaSeparatedFile();

Esto no tiene ningún problema con un programa pequeño como este, pero ... ¿Qué sucede en un programa que tiene cientos de vistas y una cantidad similar de clases de negocios? ¡El mantenimiento se convierte en una pesadilla!

Enfoque de primavera (inyección de dependencia)

Lo que Spring hace es cable las clases se crean utilizando un archivo XML o anotaciones, de esta forma todos los objetos son instanciados e inicializados por Spring y inyectado en los lugares correctos (Servlets, Frameworks web, Business classes, DAO, etc., etc., etc.).

Volviendo al ejemplo en Spring, solo necesitamos tener un setter para el userLister campo y tiene un archivo XML como este:

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

o más simplemente anotar el archivo en nuestra clase de vista con @Inject:

@Inject
private UserLister userLister;

De esta forma, cuando se crea la vista, por arte de magia tendrá un UserLister Listo para trabajar.

List<User> users = userLister.getUsers();  // This will actually work
                                           // without adding any line of code

¡Eso es genial! ¿No es así?

  • ¿Qué sucede si desea utilizar otra implementación de su UserLister ¿interfaz? Solo cambia el XML
  • ¿Qué pasa si no tienes un UserLister implementación lista? Programe una implementación simulada temporal de UserLister y facilitar el desarrollo de la vista
  • ¿Qué sucede si ya no quiero usar Spring? ¡Simplemente no lo use! Su aplicación no está acoplada a ella. Inversión de control estados: "La aplicación controla el marco, no el marco controla la aplicación".

Hay algunas otras opciones para Dependency Injection, lo que en mi opinión ha hecho que Spring sea tan famosa, además de su simplicidad, elegancia y estabilidad, que los chicos de SpringSource han programado muchos POJO que ayudan a integrar Spring con muchos otros frameworks comunes sin ser intrusivo en su aplicación. También Spring tiene varios buenos subproyectos como Spring MVC, Spring WebFlow, Spring Security y nuevamente una larga lista de etceteras.

Espero que esto ayude. De todos modos, te animo a leer Artículo de Martin Fowler acerca de la Inyección de Dependencia y la Inversión de Control porque lo hace mejor que yo. Después de entender lo básico, eche un vistazo a Documentación de primaveraen mi opinión, es  solía ser el mejor libro de primavera de todos los tiempos.


610
2018-06-30 16:04



Primavera contiene (como señaló acertadamente Skaffman) un marco MVC. Para explicarlo brevemente, aquí están mis entradas. Spring es compatible con la segregación de la capa de servicio, la capa web y la capa de negocios, pero lo que realmente hace mejor es la "inyección" de objetos. Entonces, para explicar eso con un ejemplo, considere el siguiente ejemplo:

public interface FourWheel
{
   public void drive();
}

public class Sedan implements FourWheel
{
   public void drive()
   {
      //drive gracefully
   }
}

public class SUV implements FourWheel
{
   public void drive()
   {
      //Rule the rough terrain
   }
}

Ahora en tu código tienes una clase llamada RoadTrip de la siguiente manera

public class RoadTrip
{
    private FourWheel myCarForTrip;
}

Ahora cuando quieras una instancia de Viaje; a veces es posible que desee un SUV para inicializar FourWheel o, a veces puede querer sedán. Realmente depende de lo que quieras según la situación específica.

Para resolver este problema, querría tener un patrón de fábrica como patrón de creación. Donde una fábrica devuelve la instancia correcta. Así que eventualmente terminarás con un montón de código de pegamento solo para crear una instancia de los objetos correctamente. Spring hace el trabajo del código de pegamento mejor sin ese código de pegamento. Usted declara mapeos en XML e inicializó los objetos automáticamente. También hace mucho uso de la arquitectura singleton para las instancias y eso ayuda en el uso optimizado de la memoria.

Esto también se llama inversión de control. Otros marcos para hacer esto son Google guice, Pico container, etc.

Aparte de esto, Spring tiene un marco de validación, soporte extensivo para la capa DAO en colaboración con JDBC, iBatis e Hibernate (y muchos más). Proporciona un excelente control transaccional sobre las transacciones de la base de datos.

Hay mucho más en Spring que se puede leer en buenos libros como "Pro Spring".

Las siguientes URL también pueden ser de ayuda.
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework 


56
2018-06-30 04:47



Viejos días primavera era un marco de inyección de dependencia que funcionaba solo comoGuice, PicoContainer, ...), pero hoy en día es una solución total para construirlo Aplicación empresarial.

La inyección de dependencia de primavera, que es, por supuesto, el corazón de la primavera todavía está allí (y puede revisar otras buenas respuestas aquí), pero hay más de primavera ...

Spring ahora tiene muchos proyectos, cada uno con algunos subproyectos (http://spring.io/projects) Cuando alguien habla sobre la primavera, debes descubrir qué proyecto de primavera él está hablando, ¿es solo el núcleo primaveral, que se conoce como marco de primavera, o es otro proyecto de primavera.

Algunos proyectos de primavera que vale la pena mencionar son:

Si necesita alguna característica más específica para su aplicación, puede encontrarla también allí:

  • lote de primavera  marco por lotes diseñado para permitir el desarrollo de
    aplicación por lotes
  • primavera HATEOAS fácil creación de REST API base en HATEOAS principal
  • móvil de primavera y primavera andriod para el desarrollo de aplicaciones móviles
  • carcasa de primavera  construir una aplicación de shell con todas las funciones (también conocida como línea de comando)
  • nube de primavera y flujo de datos de la nube de primavera para aplicaciones en la nube

También hay algunos pequeños proyectos allí, por ejemplo Spring-social-facebook (http://projects.spring.io/spring-social-facebook/)

Puede usar la primavera para el desarrollo web ya que tiene Spring MVC módulo que es parte de marco de primavera proyecto. O puede usar la primavera con otro trabajo de marco web, como struts2.


25
2018-05-04 05:34



¿Para qué es Spring? Contestaré esa pregunta en breve, pero primero, echemos otro vistazo al ejemplo de victor hugo. No es un gran ejemplo porque no justifica la necesidad de un nuevo marco.

public class BaseView {
  protected UserLister userLister;

  public BaseView() {
    userLister = new UserListerDB(); // only line of code that needs changing
  }
}

public class SomeView extends BaseView {
  public SomeView() {
    super();
  }

  public void render() {
    List<User> users = userLister.getUsers();
    view.render(users);
  }
}

¡Hecho! Entonces, incluso si tiene cientos o miles de vistas, solo necesita cambiar una línea de código, como en el enfoque Spring XML. Pero cambiar una línea de código aún requiere recompilar en lugar de editar XML, ¿dices? ¡Bien mi amigo quisquilloso, utiliza Ant y script!

Entonces, ¿para qué sirve Spring? Es para:

  1. Desarrolladores ciegos que siguen a la manada
  2. Los empleadores que nunca quieren contratar programadores de posgrado porque no enseñan tales marcos en Uni
  3. Proyectos que comenzaron con un mal diseño y necesitan mosaico (como se muestra en el ejemplo de Victor Hugo)

Otras lecturas: http://discuss.joelonsoftware.com/?joel.3.219431.12


24
2018-06-03 02:14



Muy brevemente resumido, diré que Spring es el "pegamento" en su aplicación. Se usa para integrar diferentes marcos y tu propio código.


18
2018-04-29 15:33



La primavera es tres cosas.

  1. Spring maneja Dependency Injection y le recomiendo que lea la excelente introducción de Martin Fowler sobre la inyección de dependencia.
  2. Lo segundo que Spring hace es envolver excelentes bibliotecas de Java de una manera muy elegante para usar en sus aplicaciones. Para un buen ejemplo, vea cómo Spring ajusta a los ejecutores de tareas y al programador de Quartz.
  3. En tercer lugar, Spring ofrece muchas implementaciones de material web como REST, un framework web MVC y más. Se dan cuenta de que, dado que está utilizando Spring para los dos primeros, tal vez solo pueda usarlo para todo lo que necesite su aplicación web.

El problema es que Spring DI está muy bien pensado, las envolturas de otras cosas están muy bien pensadas porque las otras cosas lo pensaron todo y Spring simplemente lo envuelve. Las implementaciones de Spring de MVC y REST y todas las demás cosas no están tan bien hechas (YMMV, en mi humilde opinión) pero hay excepciones (Spring Security is da bomb). Así que tiendo a utilizar Spring para DI, y sus envolturas geniales, pero prefiero otras cosas para Web (Me gusta mucho Tapestry), REST (Jersey es realmente robusto), etc.


13
2017-12-30 07:14



Lo que probablemente quieras en una aplicación web con Spring -

  • Spring MVC, que con 2.5+ le permite usar POJO como clases de controlador, lo que significa que no tiene que extenderse desde ningún marco en particular (como en Struts o Spring pre-2.5). Las clases de controlador también son muy fáciles de probar gracias en parte a la inyección de dependencia
  • Integración de Spring con Hibernate, que hace un buen trabajo al simplificar el trabajo con esa solución ORM (para la mayoría de los casos)
  • El uso de Spring para una aplicación web le permite usar sus objetos de dominio en todos los niveles de la aplicación: las mismas clases que se asignan utilizando Hibernate son las clases que usa como "form beans". Por naturaleza, esto conducirá a un modelo de dominio más robusto, en parte porque reducirá el número de clases.
  • Las etiquetas de formulario de primavera facilitan la creación de formularios sin mucha molestia.

Además, Spring es ENORME, por lo que hay muchas otras cosas que te pueden interesar usar en una aplicación web como Spring AOP o Spring Security. Pero las cuatro cosas enumeradas anteriormente describen los componentes comunes de Spring que se utilizan en una aplicación web.


11
2018-06-30 21:35



Veo dos partes de esto:

  1. "Qué es exactamente Spring for" -> ver la respuesta aceptada por victor hugo.
  2. "[...] Spring es [un] buen marco para el desarrollo web" -> la gente dice que esto está hablando de Spring MVC. Spring MVC es una de las muchas partes de Spring, y es un framework web que hace uso de las características generales de Spring, como la inyección de dependencia. Es un marco bastante genérico en el sentido de que es muy configurable: puede usar diferentes capas de db (Hibernate, iBatis, JDBC simple), diferentes capas de vista (JSP, Velocity, Freemarker ...)

Tenga en cuenta que puede usar perfectamente Spring en una aplicación web sin utilizar Spring MVC. Diría que la mayoría de las aplicaciones web de Java hacen esto, mientras usan otros marcos web como Wicket, Struts, Seam, ...


8
2018-01-10 07:55



La primavera es ideal para pegar instancias de clases juntas. Usted sabe que sus clases de Hibernate siempre van a necesitar una fuente de datos, Spring las conecta juntas (y también tiene una implementación de la fuente de datos).

Sus objetos de acceso a datos siempre necesitarán acceso de Hibernate, Spring conecta las clases de Hibernate a sus DAO por usted.

Además, Spring básicamente te brinda configuraciones sólidas de un conjunto de bibliotecas, y en eso, te brinda orientación sobre qué libretas debes usar.

La primavera es realmente una gran herramienta. (No estaba hablando de Spring MVC, solo el marco base).


7
2018-06-30 04:32



La respuesta aceptada no involucra el uso de anotaciones ya que Spring introdujo el soporte para varias anotaciones para la configuración.

Enfoque de primavera (inyección de dependencia)

Existe la otra forma de cablear las clases junto con el uso de un archivo XML: las anotaciones. Usemos el ejemplo de la respuesta aceptada y registremos el bean directamente en la clase usando una de las anotaciones @Component, @Service, @Repositoryo @Configuration:

@Component
public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

De esta forma, cuando se cree la vista, mágicamente tendrá un UserLister listo para funcionar.

La declaración anterior es válida con una pequeña ventaja de no necesitar ningún uso de archivos XML y el cableado con otra anotación @Autowired que encuentra una implementación relevante e inyectarla en.

@Autowired
private UserLister userLister;

Utilizar el @Bean anotación sobre un método utilizado para obtener la implementación de bean para inyectar.


5
2017-09-21 12:23