java español - ¿Para qué es exactamente Spring Framework?




mvc @requestmapping (15)

¿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:

  1. Desarrolladores ciegos que siguen la manada.
  2. Los empleadores que nunca quieren contratar programadores graduados porque no enseñan dichos marcos en Uni
  3. 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?


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.


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 de UserLister 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 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 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).


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.


Veo dos partes de esto:

  1. "Para qué es exactamente la primavera" -> vea la respuesta aceptada por victor hugo.
  2. "[...] 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, ...


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.


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 es una buena alternativa a la tecnología Enterprise JavaBeans (EJB) . También tiene marco web y componente de marco de servicios web.


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


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:

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 .


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


Descargo de responsabilidad: yo soy el PO de Akka

Además de ofrecer una mezcla heterogénea de concurrencia que es mucho más simple de razonar y corregir (actores, agentes, concurrencia de flujo de datos) y con control de concurrencia en la forma de STM.

Aquí hay algunos casos de uso que podría considerar:

  1. Procesamiento de transacciones (juegos en línea, finanzas, estadísticas, apuestas, redes sociales, telecomunicaciones, ...)
    • ampliación, ampliación, tolerancia a fallos / HA
  2. Servicio backend (cualquier industria, cualquier aplicación)
    • Servicio REST, SOAP, cometd etc
    • actuar como centro de mensajes / capa de integración
    • ampliación, ampliación, tolerancia a fallos / HA
  3. Snap-in concurrency / paralelismo (cualquier aplicación)
    • Correcto
    • Fácil de trabajar y entender.
    • Solo agregue los archivos jar a su proyecto JVM existente (use Scala, Java, Groovy o JRuby)
  4. Procesamiento por lotes (cualquier industria)
    • Integración de Camel para conectar con fuentes de datos por lotes
    • Los actores dividen y conquistan las cargas de trabajo por lotes.
  5. Centro de comunicaciones (telecomunicaciones, medios web, medios móviles)
    • ampliación, ampliación, tolerancia a fallos / HA
  6. Servidor de juegos (juegos en línea, apuestas)
    • ampliación, ampliación, tolerancia a fallos / HA
  7. BI / datamining / crujido de propósito general
    • ampliación, ampliación, tolerancia a fallos / HA
  8. inserte otros buenos casos de uso aquí




java spring web web-applications frameworks