Escucho mucho sobre Spring , la gente dice en toda la web que Spring es un buen marco para el desarrollo web. ¿Para qué es exactamente Spring Framework?
Escucho mucho sobre Spring , la gente dice en toda la web que Spring es un buen marco para el desarrollo web. ¿Para qué es exactamente Spring Framework?
Respuestas:
Básicamente la primavera es un marco para inyección de dependencia que es un patrón que permite construir sistemas muy desacoplados.
Por ejemplo, suponga que necesita enumerar los usuarios del sistema y declarar una interfaz llamada UserLister
:
public interface UserLister {
List<User> getUsers();
}
Y tal vez una implementación que acceda 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 ejemplifico 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 quiero cambiar de la implementación de DB 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 y cambiaría la línea anterior a:
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 visitas y un número similar de clases de negocios? ¡El mantenimiento se convierte en una pesadilla!
Lo que Spring hace es conectar las clases mediante el uso de 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 en Spring, solo necesitamos tener un configurador para el userLister
campo 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 lo archivado en nuestra clase de vista con @Inject
:
@Inject
private UserLister userLister;
De esta manera, cuando se crea la vista, mágicamente estará UserLister
lista para funcionar.
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
¡Eso es genial! ¿No es así?
UserLister
interfaz? Solo cambia el XML.UserLister
implementación lista? Programe una implementación simulada temporal UserLister
y facilite el desarrollo de la vista.Hay algunas otras opciones para la inyección de dependencia por ahí, lo que en mi opinión ha hecho que Spring sea tan famoso además de su simplicidad, elegancia y estabilidad es que los muchachos de SpringSource han programado muchos POJO que ayudan a integrar Spring con muchos otros marcos comunes sin ser intrusivo en su aplicación. Además, Spring tiene varios subproyectos buenos como Spring MVC, Spring WebFlow, Spring Security y, de nuevo, una lista muuucha de etcétera.
Espero que esto ayude. De todos modos, te animo 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, suele ser el mejor libro de Spring de todos los tiempos.
Spring contiene ( como Skaffman señaló correctamente ) un marco MVC. Para explicar en breve aquí están mis entradas. Spring admite la segregación de la capa de servicio, la capa web y la capa empresarial, 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 su código tiene una clase llamada RoadTrip de la siguiente manera
public class RoadTrip
{
private FourWheel myCarForTrip;
}
Ahora, cuando quieras una instancia de Trip; a veces puede querer un SUV para inicializar FourWheel o, a veces, puede querer Sedan. Realmente depende de lo que quieras en función de una situación específica.
Para resolver este problema, querrá tener un Patrón de fábrica como patrón de creación. Donde una fábrica devuelve la instancia correcta. Entonces, eventualmente terminarás con un montón de código de pegamento solo para instanciar objetos correctamente. Spring hace el trabajo del código de pegamento mejor sin ese código de pegamento. Declara 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, contenedor Pico, 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 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, Spring era un marco de inyección de dependencia que funcionaba solo como ( Guice , PicoContainer , ...), pero hoy en día es una solución total para construir 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, debes averiguar de qué proyecto de primavera está hablando, si es solo el núcleo de primavera, que se conoce como marco de primavera , o si se trata de otros proyectos 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, también puede encontrarla allí:
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 Spring MVC
módulo que forma parte del proyecto Spring Framework . O puede usar spring con otro marco web, como struts2 .
¿Para qué sirve la primavera? 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! Ahora, incluso si tiene cientos o miles de vistas, solo necesita cambiar la 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, dice? Bueno, mi amigo quisquilloso, ¡usa Ant y script!
Entonces, ¿para qué sirve la primavera? Es para:
Lectura adicional: http://discuss.joelonsoftware.com/?joel.3.219431.12
UserLister
), pero ¿qué pasa si necesita varios servicios, no compartidos entre los diferentes BaseView
hijos? (Afortunadamente) no hay herencia múltiple en Java.
La primavera es tres cosas.
El problema es que Spring DI está muy bien pensado, las envolturas alrededor de otras cosas están muy bien pensadas en que las otras cosas lo pensaron todo y Spring simplemente lo envuelve muy bien. Las implementaciones de Spring de MVC y REST y todo lo demás no está tan bien hecho (YMMV, IMHO) pero hay excepciones (Spring Security es una bomba). Por lo tanto, tiendo a usar Spring para DI y sus geniales envoltorios, pero prefiero otras cosas para la Web (me gusta mucho Tapestry), REST (Jersey es realmente robusto), etc.
Lo que probablemente querría en una aplicación web con Spring:
Además, Spring es ENORME, por lo que hay muchas otras cosas que podría interesarle usar en una aplicación web como Spring AOP o Spring Security. Pero las cuatro cosas mencionadas anteriormente describen los componentes comunes de Spring que se usan en una aplicación web.
Veo dos partes para esto:
Tenga en cuenta que puede usar Spring perfectamente en una aplicación web sin usar Spring MVC. Yo diría que la mayoría de las aplicaciones web Java hacen esto, mientras usan otros marcos web como Wicket, Struts, Seam, ...
La primavera es ideal para pegar instancias de clases juntas. 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 a Hibernate, Spring conecta las clases de Hibernate a sus DAO por usted.
Además, Spring básicamente le brinda configuraciones sólidas de un montón 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 el marco base).
La respuesta aceptada no implica el uso de anotaciones desde que Spring introdujo el soporte para varias anotaciones para la configuración.
Existe otra forma de conectar las clases junto con un archivo XML: las anotaciones. Vamos a usar el ejemplo de la respuesta aceptada y registran el grano directamente en la clase utilizando 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 funcionar.
La declaración anterior es válida con una pequeña ventaja de no necesitar ningún uso de archivos XML y conectar con otra anotación @Autowired
que encuentre una implementación relevante y la inyecte.
@Autowired
private UserLister userLister;
Use la @Bean
anotación en un método utilizado para inyectar la implementación del bean.
@Bean
anotación a nivel de clase. Debe ser uno de @Component
, @Service
, @Repository
etc. El descanso es correcta. Quizás también deba señalar que el Autoconexión de la interfaz de esta manera solo funcionará si solo hay 1 clase candidata en classpath adecuada para inyección, de lo contrario, error de aplicación Spring.
La ventaja es inyección de dependencia (DI) . Significa externalizar la tarea de creación de objetos. Permítanme explicarlo 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 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! Imagine que hay 50 clases diferentes utilizadas por 50 personas diferentes. Sería un desastre. En este caso, necesitamos desacoplar el sistema. Reescribamos 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 Lunch Type como parámetro a nuestro constructor. Aquí, la creación de objetos se subcontrata. Este código se puede conectar mediante el archivo de configuración Xml (heredado) o las anotaciones de Java (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 esté débilmente acoplado, sino que simplifica la escritura de pruebas de Unidad, ya que permite burlarse de las dependencias. Por último, pero no menos importante, DI optimiza 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 arriba DI es inyección de constructor.
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
Spring es una buena alternativa a la tecnología Enterprise JavaBeans (EJB) . También tiene un marco web y un componente de marco de servicios web.
Spring comenzó como un sistema de inyección de dependencia bastante simple. Ahora es enorme y tiene todo (excepto el fregadero de la cocina proverbial).
Pero no temas, es bastante modular, por lo que puedes usar solo las piezas que quieras.
Para ver dónde comenzó todo, intente:
Puede ser viejo pero es un libro excelente.
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 mirarlo.
Spring fue la inyección de dependencia al principio, luego agregue el rey de los contenedores para casi todo (envoltorio sobre implementaciones JPA, etc.).
Larga historia ... la mayoría de las partes de Spring prefieren soluciones XML (motor de secuencias de comandos XML ... brrrr), así que para DI utilizo Guice
Buena biblioteca, pero con un depnedenciec creciente, por ejemplo Spring JDBC (tal vez una solución Java jdbc con parámetros de nombres reales) toma de maven 4-5 a continuación.
Usando Spring MVC (parte de "big spring") para el desarrollo web ... es un marco "basado en solicitudes", hay una guerra santa "solicitud vs componente" ... depende de usted
En el pasado pensé en Spring Framework desde un punto de vista puramente técnico.
Dada cierta 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 (conectar) la aplicación en el marco de Spring. La inyección de dependencia del framework Spring es responsable de conectar / cablear beans individuales en una aplicación que funcione.
De esta forma, 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 granos individuales. Se pueden desacoplar y burlar fácilmente, por lo que las pruebas unitarias son rápidas y eficientes.
Spring framework define múltiples beans especializados, como @Controller ( @Restcontroller ), @Repository , @Component para fines web. Spring junto con Maven proporcionan una estructura 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.
Spring Framework es definitivamente bueno para el desarrollo web y para ser más específico para los servicios de API relajantes.
Es bueno para lo anterior debido a su inyección de dependencia e integración con otros módulos como spring security , spring aop , mvc framework , microservicios
Con cualquier aplicación, la seguridad es probablemente un requisito.
Si desea crear un producto que requiera un mantenimiento prolongado, necesitará utilizar el concepto Aop.
Si su aplicación tiene mucho tráfico aumentando así la carga, debe usar el concepto de microservicios.
Spring ofrece todas estas características en una sola plataforma. Soporte con muchos módulos .
Lo más importante, Spring es de código abierto y un marco extensible, tiene un gancho en todas partes para integrar código personalizado en el ciclo de vida.
Spring Data es un proyecto que proporciona integración con su proyecto.
Por lo tanto, la primavera puede adaptarse a casi todos los requisitos.