¿Para qué sirve exactamente Spring Framework?

Escuché mucho sobre Spring , 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?

Básicamente Spring es un marco para la dependency injection 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 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 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 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 progtwig pequeño como este, pero … ¿Qué sucede en un progtwig que tiene cientos de vistas y una cantidad similar de clases de negocios? ¡El mantenimiento se convierte en una pesadilla!

Enfoque de spring (dependency injection)

Lo que Spring hace es cablear las clases usando un archivo XML o anotaciones, de esta forma todos los objetos son instanciados e inicializados por Spring e inyectados en los lugares correctos (Servlets, Frameworks Web, Business Class, DAO, etc., etc. …).

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

     

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

 @Inject private UserLister userLister; 

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

 List 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 interfaz de UserLister ? Solo cambia el XML
  • ¿Qué pasa si no tiene una implementación de UserLister lista? Progtwigr 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 estados de control : “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 progtwigdo 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 que leas el artículo de Martin Fowler sobre Inyección de dependencia e Inversión de control porque lo hace mejor que yo. Después de comprender los conceptos básicos, eche un vistazo a la Documentación de spring , en mi opinión, solía ser el mejor libro de spring de todos los tiempos.

Spring contiene ( como Skaffman señaló correctamente ) 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 architecture 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

En los viejos tiempos, la spring era un marco de dependency injection que funcionaba solo como ( Guice , PicoContainer , …), pero ahora es una solución total para crear su Aplicación empresarial .

La dependency injection de spring, que es, por supuesto, el corazón de la spring todavía está allí (y puede revisar otras buenas respuestas aquí), pero hay más de spring …

Spring ahora tiene muchos proyectos, cada uno con algunos subproyectos ( http://spring.io/projects ). Cuando alguien habla sobre la spring, debe averiguar de qué proyecto de spring está hablando, si es solo un núcleo springl, lo que se conoce como armazón de spring , o es otro proyecto de spring.

Algunos proyectos de spring que vale la pena mencionar son:

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

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

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

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

¿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 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 recomstackr 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 progtwigdores 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)

Lectura adicional: http://discuss.joelonsoftware.com/?joel.3.219431.12

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

La spring es tres cosas.

  1. Spring maneja Dependency Injection y le recomiendo que lea la excelente introducción de Martin Fowler sobre la dependency injection.
  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 progtwigdor 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.

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 dependency injection
  • 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 tags de formulario de spring 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.

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 dependency injection. 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, …

La spring 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 spring es realmente una gran herramienta. (No estaba hablando de Spring MVC, solo el marco base).

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

Enfoque de spring (dependency injection)

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 , @Repository o @Configuration :

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

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

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

 @Autowired private UserLister userLister; 

Use la anotación @Bean en un método utilizado para obtener la implementación de bean para inyectar.

La ventaja es la Inyección de Dependencia (DI) . Significa externalizar la tarea de creación de objetos. Déjenme explicar con un ejemplo.

 public interface Lunch { public void eat(); } public class Buffet implements Lunch { public void eat() { // Eat as much as you can } } public class Plated implements Lunch { public void eat() { // Eat a limited portion } } 

Ahora en mi código tengo una clase LunchDecide de la siguiente manera:

 public class LunchDecide { private Lunch todaysLunch; public LunchDecide(){ this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want //this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion } } 

En la clase anterior, dependiendo de nuestro estado de ánimo, elegimos Buffet () o Plateado (). Sin embargo, este sistema está estrechamente acoplado. Cada vez que necesitamos un tipo diferente de objeto, necesitamos cambiar el código. En este caso, comentar una línea! Imagine que hay 50 clases diferentes utilizadas por 50 personas diferentes. Sería un desastre. En este caso, necesitamos desacoplar el sistema. Vamos a reescribir la clase LunchDecide.

 public class LunchDecide { private Lunch todaysLunch; public LunchDecide(Lunch todaysLunch){ this.todaysLunch = todaysLunch } } 

Tenga en cuenta que, en lugar de crear un objeto utilizando una palabra clave nueva, pasamos la referencia a un objeto de Tipo de almuerzo como parámetro para nuestro constructor. Aquí, la creación de objetos se subcontrata. Este código se puede conectar con el archivo de configuración Xml (heredado) o las anotaciones Java (moderno). De cualquier manera, la decisión sobre qué tipo de objeto se crearía se haría allí durante el tiempo de ejecución. Un objeto sería inyectado por Xml en nuestro código: nuestro código depende de Xml para ese trabajo. Por lo tanto, Inyección de Dependencia (DI). DI no solo ayuda a hacer que nuestro sistema se acople de manera flexible, sino que también simplifica la escritura de las pruebas unitarias, ya que permite burlar las dependencias. Por último, DI simplifica la Progtwigción Orientada a Aspectos (AOP) que conduce a un mayor desacoplamiento y aumento de la modularidad. También tenga en cuenta que arriba DI es Constructor Injection. DI también puede ser realizado por Setter Injection, el mismo método de encapsulamiento antiguo.

Spring es una buena alternativa a la tecnología Enterprise JavaBeans (EJB) . También tiene un marco de trabajo web y un componente del marco de servicios web.

Spring comenzó como un sistema de dependency injection bastante simple. Ahora es enorme y tiene todo lo que contiene (excepto el proverbial fregadero de la cocina).

Pero no temas, es bastante modular, así que puedes usar solo las piezas que quieras.

Para ver dónde comenzó todo, intente:

http://www.amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8&s=books&qid=1246374863&sr=1-1

Puede ser viejo, pero es un libro excelente.

Para otro buen libro esta vez dedicado exclusivamente a la spring, vea:

http://www.amazon.com/Professional-Java-Development-Spring-Framework/dp/0764574833/ref=sr_1_2?ie=UTF8&s=books&qid=1246374863&sr=1-2

También hace referencia a versiones anteriores de Spring, pero definitivamente vale la pena mirarlo.

Spring fue una dependency injection al principio, y luego se agregó una gran cantidad de envoltorios para casi todo (envoltorio sobre implementaciones JPA, etc.).

Larga historia … la mayoría de las partes de Spring prefirieron las soluciones XML (XML scripting engine … brrrr), así que para DI utilizo Guice

Una buena biblioteca, pero con una depnedenciec creciente, por ejemplo Spring JDBC (quizás una solución Java jdbc con parámetros de nombres reales) tome de maven 4-5 siguiente.

El uso de Spring MVC (parte de “big spring”) para el desarrollo web … es un marco “basado en solicitud”, existe una “demanda contra componente” de guerra santa … depende de usted

  • Spring es un marco ligero y flexible en comparación con J2EE.
  • El contenedor de resorte actúa como una inversión de control.
  • Spring usa AOP, es decir, proxies y Singleton, fábrica y patrones de diseño de métodos de plantillas.
  • Arquitecturas escalonadas: separación de preocupaciones y capas reutilizables y mantenimiento fácil.

enter image description here

En el pasado, pensaba en Spring framework desde un punto de vista puramente técnico.

Dada la experiencia de trabajo en equipo y el desarrollo de Webapps empresariales, diría que Spring es para un desarrollo más rápido de las aplicaciones (aplicaciones web) al desacoplar sus elementos individuales (beans). Un desarrollo más rápido lo hace tan popular. Spring permite cambiar la responsabilidad de construir (cablear) la aplicación en el marco de Spring. La dependency injection de la estructura Spring es responsable de conectar / conectar individualmente beans en una aplicación en funcionamiento.

De esta forma, los desarrolladores pueden enfocarse más en el desarrollo de componentes individuales (beans) tan pronto como se definan las interfaces entre los beans.

La prueba de tal aplicación es fácil: el enfoque principal se da a los granos individuales. Se pueden desacoplar y burlar fácilmente, por lo que las pruebas unitarias son rápidas y eficientes.

El marco Spring define múltiples beans especializados como @Controller ( @Restcontroller ), @Repository , @Component para fines web. Spring junto con Maven proporcionan una estructura que es intuitiva para los desarrolladores. El trabajo en equipo es fácil y rápido ya que los elementos individuales se mantienen separados y pueden reutilizarse.

Spring framework es definitivamente bueno para el desarrollo web más específico para la API de Rest. Es por su dependency injection e integración con otros módulos como seguridad de spring , spring aop , mvc framework , microservicios

Cualquier aplicación que crees definitivamente necesitas seguridad.
Si construyes un producto, mantenimiento prolongado, definitivamente necesitarás el concepto Aop.

Si su aplicación tiene mucha más carga, entonces necesita implementar microservicios.

Spring está dando todo esto en una plataforma. Soporte con muchos módulos
Lo principal es que la spring es de código abierto y marco extensible, tiene un gancho en todas partes para integrar el código personalizado en el ciclo de vida.

Spring Data es un proyecto que proporciona integración con su proyecto.

Entonces, todo lo que necesitas para crear una aplicación tiene Spring.