java - requestmapping - ¿Para qué es exactamente Spring Framework?
spring mvc español (17)
¿Para qué es la primavera? Responderé a 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! Así que ahora, incluso si tiene cientos o miles de vistas, solo necesita cambiar la línea de código, como en el enfoque de Spring XML. ¿Pero cambiar una línea de código aún requiere una recompilación en lugar de editar XML? Bueno, mi amigo quisquilloso, ¡usa Ant y el guión de distancia!
Entonces, ¿para qué es la primavera? Es para:
- Desarrolladores ciegos que siguen la manada.
- Los empleadores que nunca quieren contratar programadores graduados porque no enseñan dichos marcos en Uni
- Proyectos que comenzaron con un mal diseño y necesitan un patchwork (como lo muestra el ejemplo de victor hugo)
Lectura adicional: http://discuss.joelonsoftware.com/?joel.3.219431.12
Escucho mucho sobre Spring , la gente está diciendo en toda la web que Spring es un buen marco para el desarrollo web. ¿Para qué es exactamente Spring Framework?
Antiguos, la primavera era un marco de inyección de dependencias que solo funcionaba como ( Guice , PicoContainer , ...), pero hoy en día es una solución total para crear su 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 la primavera ...
Spring ahora tiene muchos proyectos, cada uno con algunos subproyectos ( http://spring.io/projects ). Cuando alguien habla sobre la primavera, debe averiguar de qué proyecto de primavera está hablando, es solo el núcleo de la primavera, que se conoce como marco de la primavera , o es otro proyecto de la primavera.
Algunos proyectos de primavera que vale la pena mencionar son:
- seguridad de primavera - http://projects.spring.io/spring-security/
- servicios web de primavera - http://projects.spring.io/spring-ws/
- integración de primavera - http://projects.spring.io/spring-integration/
Si necesita alguna característica más específica para su aplicación, puede encontrarla allí también:
- lote de lotes de primavera diseñado para permitir el desarrollo de
aplicación por lotes - primavera HATEOAS creación fácil de la base de API REST en el director de HATEOAS
- Spring Mobile 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 comandos)
- Nube de primavera y flujo de datos de nube de primavera 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 usar Spring para el desarrollo web, ya que tiene el módulo Spring MVC
que forma parte del proyecto Spring Framework . O puede usar Spring con otro trabajo de marco web, como struts2 .
Básicamente, Spring es un marco para dependency-injection de dependency-injection que es un patrón que permite construir sistemas muy desacoplados.
El problema
Por ejemplo, suponga que necesita enumerar a los usuarios del sistema y, por lo tanto, 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, necesitará 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 instalo explícitamente el objeto de esta manera:
UserLister userLister = new UserListerDB();
... Acoplaría la vista con mi implementación de la clase que accede a la base de datos. ¿Qué sucede si deseo cambiar de la implementación de la base de datos a otra que obtenga la lista de usuarios de un archivo separado por comas (recuerde, es un ejemplo)? En ese caso, volverí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 ... Lo que sucede en un programa que tiene cientos de visitas y un número similar de clases de negocios. El mantenimiento se convierte en una pesadilla!
Enfoque de primavera (inyección de dependencia)
Lo que Spring hace es conectar las clases mediante un archivo XML o anotaciones, de esta manera todos los objetos son instanciados e inicializados por Spring e inyectados en los lugares correctos (Servlets, Web Frameworks, Clases de negocios, DAO, etc., etc., etc.). ...).
Volviendo al ejemplo de Spring, solo necesitamos tener un userLister
para el campo userLister
y tener un archivo XML como este:
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
o más simplemente anote el archivo en nuestra clase de vista con @Inject
:
@Inject
private UserLister userLister;
De esta manera, cuando se crea la vista, mágicamente 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 interfaz de
UserLister
? Solo cambia el XML - ¿Qué pasa si no tengo una implementación de
UserLister
lista? Programe una implementación temporal simulada deUserLister
y facilite el desarrollo de la vista - ¿Y si ya no quiero usar Spring? Simplemente no lo uses! Su aplicación no está acoplada a ella. La inversión de los estados de control : "La aplicación controla el marco, no el marco controla la aplicación".
Hay algunas otras opciones para la inyección de dependencia, lo que en mi opinión ha hecho que Spring sea tan famosa, además de su simplicidad, elegancia y estabilidad es que los chicos de SpringSource han programado muchos POJO que ayudan a integrar Spring con muchos otros marcos comunes sin estar Intrusivo en su aplicación. Además, Spring tiene varios buenos subproyectos como Spring MVC, Spring WebFlow, Spring Security y, de nuevo, una larga lista de etcétera.
Espero que esto ayude. De todos modos, lo aliento a leer 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, se utiliza para ser el mejor libro de Spring.
En el pasado pensé en Spring Framework desde un punto de vista puramente técnico.
Dada la experiencia de trabajo en equipo y desarrollo de Webapps empresariales, diría que Spring es para un desarrollo más rápido de aplicaciones (aplicaciones web) al desacoplar sus elementos individuales (beans). El 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 inyección de dependencia de Spring Framework es responsable de conectar / cablear beans individuales a una aplicación que funcione.
De esta manera, los desarrolladores pueden centrarse más en el desarrollo de componentes individuales (beans) tan pronto como se definan las interfaces entre beans.
La prueba de dicha aplicación es fácil: el enfoque principal se da a los frijoles individuales. Se pueden desacoplar y simular fácilmente, por lo que la prueba de unidades es rápida y eficiente.
Spring Framework define múltiples beans especializados, como @Controller ( @Restcontroller ), @Repository , @Component para servir con 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 hay elementos individuales que se mantienen separados y se pueden reutilizar.
La primavera es genial para pegar ejemplos de clases juntos. Usted sabe que sus clases de Hibernate siempre necesitarán una fuente de datos, Spring las conecta (y también tiene una implementación de la fuente de datos).
Sus objetos de acceso a datos siempre necesitarán acceso de Hibernación, Spring conecta las clases de Hibernación a sus DAO para usted.
Además, Spring básicamente le brinda configuraciones sólidas de un grupo de bibliotecas, y en eso le brinda orientación sobre qué bibliotecas debe usar.
La primavera es realmente una gran herramienta. (No estaba hablando de Spring MVC, solo del framework base).
La primavera es tres cosas.
- Spring maneja la inyección de dependencia y le recomiendo que lea la excelente introducción de Martin Fowler sobre la inyección de dependencia.
- Lo segundo que hace Spring es envolver excelentes bibliotecas de Java en una forma muy elegante de usar en sus aplicaciones. Para ver un buen ejemplo, vea cómo Spring envuelve a los Ejecutores de Tareas y al Programador de Cuarzo.
- En tercer lugar, Spring proporciona un montón de implementaciones de elementos web como REST, un marco web MVC y más. Saben que, dado que estás usando Spring para los dos primeros, quizás puedas usarlo para todo lo que tu aplicación web necesite.
El problema es que Spring DI está realmente bien pensada, las envolturas alrededor de otras cosas están muy bien pensadas en que las otras cosas pensaron todo y Spring simplemente lo envuelve muy bien. Las implementaciones de Spring de MVC y REST y todas las demás cosas no están tan bien hechas (YMMV, IMHO) pero hay excepciones (Spring Security is da bomb). Así que tiendo a usar Spring para DI, y sus envoltorios geniales, pero prefiero otras cosas para la Web (me gusta mucho Tapestry), REST (Jersey es realmente robusto), etc.
La primavera fue la inyección de dependencia al principio, luego agregar el rey de las envolturas para casi todo (envoltura sobre implementaciones JPA, etc.).
Una larga historia ... la mayoría de las partes de las soluciones XML preferidas de Spring (motor de secuencias de comandos XML ... brrrr), así que para DI uso Guice
Buena biblioteca, pero con creciente depnedenciec, por ejemplo, Spring JDBC (quizás una solución Java jdbc con parámetros de nombres reales) tome de Maven 4-5 a continuación.
Usando Spring MVC (parte de "Big Spring") para el desarrollo web ... es un marco "basado en la solicitud", hay una guerra santa "solicitud vs componente" ... depende de usted
La respuesta aceptada no implica el uso de anotaciones desde que Spring introdujo el soporte para varias anotaciones para la configuración.
Enfoque de primavera (inyección de dependencia)
Hay otra forma de conectar las clases con 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<User> getUsers() {
// DB access code here
}
}
De esta manera, cuando se crea la vista, mágicamente tendrá un UserLister listo para trabajar.
La declaración anterior es válida con una pequeña bonificación de que no es necesario el uso de ningún archivo XML y el cableado con otra anotación @Autowired
que encuentra una implementación relevante e la inyecta.
@Autowired
private UserLister userLister;
Utilice la anotación @Bean
en un método que se usa para hacer que la implementación del bean se inyecte.
La ventaja es la inyección de dependencia (DI) . Significa subcontratar la tarea de creación de objetos. Déjeme 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 como sigue:
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 Plated (). Sin embargo, este sistema está estrechamente acoplado. Cada vez que necesitamos un tipo diferente de Objeto, necesitamos cambiar el código. En este caso, comentando una línea! Imagina que hay 50 clases diferentes usadas por 50 personas diferentes. Sería un infierno de un lío. En este caso, tenemos que 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 con una nueva palabra clave, pasamos la referencia a un objeto de Tipo de almuerzo como un parámetro para nuestro constructor. Aquí, la creación de objetos es subcontratada. Este código se puede conectar mediante un archivo de configuración Xml (heredado) o Java Annotations (moderno). De cualquier manera, la decisión sobre qué tipo de objeto se crearía se tomaría allí durante el tiempo de ejecución. Xml inyectaría un objeto en nuestro código. Nuestro Código depende de Xml para ese trabajo. Por lo tanto, la inyección de dependencia (DI). DI no solo ayuda a hacer que nuestro sistema se acople de manera flexible, sino que simplifica la escritura de las pruebas Unitarias, ya que permite burlar las dependencias. Por último, pero no menos importante, DI agiliza la Programación Orientada a Aspectos (AOP) que conduce a un mayor desacoplamiento y un aumento de la modularidad. También tenga en cuenta que por encima de DI es Inyección Constructor. La DI también se puede realizar mediante inyección de Setter: el mismo método de configuración tradicional desde la encapsulación.
Lo que probablemente querrías en una aplicación web con Spring -
- Spring MVC, que con 2.5+ le permite usar POJOs 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 controladores también son fáciles de probar gracias en parte a la inyección de dependencia
- Integración de Spring con Hibernate, que simplifica mucho el trabajo con esa solución ORM (en 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 con Hibernate son las clases que usa como "beans de formulario". Por naturaleza, esto conducirá a un modelo de dominio más robusto, en parte porque reducirá el número de clases.
- Las etiquetas Spring Form facilitan la creación de formularios sin muchas complicaciones.
Además, Spring es GRANDE, por lo que hay muchas otras cosas que podría interesarle utilizar 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.
Muy brevemente resumido, diré que Spring es el "pegamento" en su aplicación. Se utiliza para integrar diferentes marcos y su propio código.
Spring contiene ( como bien señaló Skaffman ) un marco MVC. Para explicar en breve aquí están mis aportaciones. Spring admite 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 que con un ejemplo consideremos 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 como sigue
public class RoadTrip
{
private FourWheel myCarForTrip;
}
Ahora cuando quieras una instancia de Trip; a veces es posible que desee que un SUV inicie FourWheel o, a veces, que desee Sedan. Realmente depende de lo que quieras basado en una 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 de código de pegamento mejor sin ese código de pegamento. Usted declara las asignaciones en XML e inicializa los objetos automáticamente. También hace mucho uso de la arquitectura Singleton para instancias y eso ayuda a optimizar el uso de la memoria.
Esto también se llama Inversión de control. Otros marcos para hacer esto son Google Guice, Pico Container, etc.
Además de esto, Spring tiene un marco de validación, un amplio soporte 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 base de datos.
Hay mucho más en Spring que puede leerse en buenos libros como "Pro Spring".
Las siguientes URL pueden ser de ayuda también.
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
Spring Framework es definitivamente bueno para el desarrollo web más específico para Rest api. Es debido a su inyección de dependencia e integración con otros módulos como Spring Security , Spring Aop , Mvc Framework , microservices
Cualquier aplicación que construyas definitivamente necesitas seguridad.
Si crea un producto con un mantenimiento prolongado, definitivamente necesitará el concepto Aop.
Si su aplicación tiene mucha más carga, entonces necesita implementar microservicios.
La primavera está dando todo esto en una plataforma. Soporte con muchos modulos.
Lo principal es que Spring es una fuente abierta y un 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.
Así que todo lo que necesitas para construir una aplicación tiene Spring.
Spring comenzó como un sistema de inyección de dependencia bastante simple. Ahora es enorme y tiene todo (excepto el proverbial fregadero de la cocina).
Pero no temas, es bastante modular, por lo que puedes usar solo las piezas que deseas.
Para ver donde comenzó todo intento:
Puede ser viejo pero es un excelente libro.
Para otro buen libro esta vez dedicado exclusivamente a la primavera, ver:
También hace referencia a versiones anteriores de Spring, pero definitivamente vale la pena verlas.
Spring es una buena alternativa a la tecnología Enterprise JavaBeans (EJB) . También tiene marco web y componente de marco de servicios web.
Veo dos partes de esto:
- "Para qué es exactamente la primavera" -> vea la respuesta aceptada por victor hugo.
- "[...] Spring es [un] buen marco para el desarrollo web" -> la gente dice que se está hablando de Spring MVC. Spring MVC es una de las muchas partes de Spring, y es un marco web que utiliza las características generales de Spring, como la inyección de dependencia. Es un marco bastante genérico porque es muy configurable: puede usar diferentes capas de db (Hibernate, iBatis, plain JDBC), diferentes capas de vista (JSP, Velocity, Freemarker ...)
Tenga en cuenta que puede utilizar Spring perfectamente en una aplicación web sin utilizar Spring MVC. Diría que la mayoría de las aplicaciones web de Java hacen esto, al usar otros frameworks web como Wicket, Struts, Seam, ...
- Spring es un marco ligero y flexible en comparación con J2EE.
- El contenedor de primavera actúa como una inversión de control.
- Spring utiliza AOP, es decir, proxies y Singleton, Factory y Pattern Method Template Pattern.
- Arquitecturas escalonadas: Separación de inquietudes y capas reutilizables y fácil mantenimiento.