¿Por qué elegir Spring como su marco de Java?

1. Información general

En este artículo, repasaremos la principal propuesta de valor de Spring como uno de los frameworks Java más populares.

Más importante aún, intentaremos entender las razones por las que Spring es nuestro marco de elección. Los detalles de Spring y sus partes constituyentes se han cubierto ampliamente en nuestros tutoriales anteriores. Por lo tanto, saltaremos las partes introductorias del "cómo" y nos centraremos principalmente en los "por qué".

2. ¿Por qué utilizar cualquier marco?

Antes de comenzar cualquier discusión en particular sobre Spring, primero entendamos por qué necesitamos usar cualquier marco en primer lugar.

Un lenguaje de programación de propósito general como Java es capaz de soportar una amplia variedad de aplicaciones . Sin mencionar que Java se está trabajando y mejorando activamente todos los días.

Además, existen innumerables bibliotecas de código abierto y propietarias para admitir Java en este sentido.

Entonces, ¿por qué necesitamos un marco después de todo? Honestamente, no es absolutamente necesario utilizar un marco para realizar una tarea. Sin embargo, a menudo es aconsejable utilizar uno por varias razones:

  • Nos ayuda a concentrarnos en la tarea principal en lugar de en el modelo estándar asociado a ella.
  • Reúne años de sabiduría en forma de patrones de diseño
  • Nos ayuda a cumplir con los estándares regulatorios y de la industria
  • Reduce el costo total de propiedad de la aplicación

Acabamos de arañar la superficie aquí y debemos decir que los beneficios son difíciles de ignorar. Pero no todo puede ser positivo, entonces cuál es el truco:

  • Nos obliga a escribir una solicitud de una manera específica.
  • Se vincula a una versión específica de lenguaje y bibliotecas
  • Se suma a la huella de recursos de la aplicación

Francamente, no existen soluciones milagrosas en el desarrollo de software y los marcos ciertamente no son una excepción a eso. Por lo tanto, la elección de qué marco o ninguno debe eliminarse del contexto.

Con suerte, estaremos en mejores condiciones para tomar esta decisión con respecto a Spring en Java al final de este artículo.

3. Breve descripción general del ecosistema de primavera

Antes de comenzar nuestra evaluación cualitativa de Spring Framework, echemos un vistazo más de cerca a cómo se ve el ecosistema de Spring.

Spring nació en algún lugar en 2003, en un momento en que Java Enterprise Edition estaba evolucionando rápidamente y el desarrollo de una aplicación empresarial era emocionante pero, no obstante, tedioso.

Spring comenzó como un contenedor de inversión de control (IoC) para Java. Todavía relacionamos a Spring principalmente con él y, de hecho, forma el núcleo del marco y otros proyectos que se han desarrollado sobre él.

3.1. Marco de primavera

Spring Framework está dividido en módulos, lo que hace que sea realmente fácil de elegir en partes para usar en cualquier aplicación:

  • Núcleo: proporciona funciones principales como DI (inyección de dependencia), internacionalización, validación y AOP (programación orientada a aspectos)
  • Acceso a datos: admite el acceso a datos a través de JTA (Java Transaction API), JPA (Java Persistence API) y JDBC (Java Database Connectivity)
  • Web: admite tanto la API de Servlet (Spring MVC) como la API reactiva reciente (Spring WebFlux), y además admite WebSockets, STOMP y WebClient
  • Integración: admite la integración con Enterprise Java a través de JMS (Java Message Service), JMX (Java Management Extension) y RMI (Remote Method Invocation)
  • Pruebas: amplio soporte para pruebas unitarias y de integración a través de Mock Objects, Test Fixtures, Context Management y Caching

3.2. Proyectos Primavera

Pero lo que hace que Spring sea mucho más valiosa es un ecosistema fuerte que ha crecido a su alrededor a lo largo de los años y que continúa evolucionando activamente . Estos están estructurados como proyectos Spring que se desarrollan sobre el marco Spring.

Aunque la lista de proyectos de Spring es larga y sigue cambiando, hay algunos que vale la pena mencionar:

  • Boot: nos proporciona un conjunto de plantillas muy opuestas pero extensibles para crear varios proyectos basados ​​en Spring casi en poco tiempo. Hace que sea realmente fácil crear aplicaciones Spring independientes con Tomcat integrado o un contenedor similar.
  • Nube: proporciona soporte para desarrollar fácilmente algunos de los patrones comunes del sistema distribuido, como el descubrimiento de servicios, el disyuntor y la puerta de enlace API. Nos ayuda a reducir el esfuerzo de implementar tales patrones repetitivos en plataformas locales, remotas o incluso administradas.
  • Seguridad: proporciona un mecanismo robusto para desarrollar autenticación y autorización para proyectos basados ​​en Spring de una manera altamente personalizable. Con un soporte declarativo mínimo, obtenemos protección contra ataques comunes como la fijación de sesiones, el click-jacking y la falsificación de solicitudes entre sitios.
  • Móvil: proporciona capacidades para detectar el dispositivo y adaptar el comportamiento de la aplicación en consecuencia. Además, admite la gestión de vistas basada en dispositivos para una experiencia de usuario óptima, gestión de preferencias de sitios y cambio de sitios.
  • Lote: proporciona un marco ligero para desarrollar aplicaciones por lotes para sistemas empresariales como el archivo de datos. Tiene soporte intuitivo para programar, reiniciar, omitir, recopilar métricas y registrar. Además, admite la ampliación para trabajos de gran volumen mediante la optimización y la partición.

No hace falta decir que esta es una introducción bastante abstracta a lo que Spring tiene para ofrecer. Pero nos proporciona suficiente terreno con respecto a la organización y amplitud de Spring para llevar nuestra discusión más allá.

4. Primavera en acción

Es habitual agregar un programa de saludo mundial para comprender cualquier tecnología nueva.

Veamos cómo Spring puede hacer que sea muy fácil escribir un programa que haga más que solo hola-mundo . Crearemos una aplicación que expondrá las operaciones CRUD como API REST para una entidad de dominio como Empleado respaldada por una base de datos en memoria. Además, protegeremos nuestros puntos finales de mutación mediante autenticación básica. Por último, ninguna aplicación puede estar realmente completa sin buenas pruebas unitarias antiguas.

4.1. Configuración del proyecto

Configuraremos nuestro proyecto Spring Boot usando Spring Initializr, que es una conveniente herramienta en línea para arrancar proyectos con las dependencias adecuadas. Agregaremos Web, JPA, H2 y Security como dependencias del proyecto para configurar correctamente la configuración de Maven.

Más detalles sobre bootstrapping están disponibles en uno de nuestros artículos anteriores.

4.2. Modelo de dominio y persistencia

With so little to be done, we are already ready to define our domain model and persistence.

Let's first define the Employee as a simple JPA entity:

@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @NotNull private String firstName; @NotNull private String lastName; // Standard constructor, getters and setters }

Note the auto-generated id we've included in our entity definition.

Now we have to define a JPA repository for our entity. This is where Spring makes it really simple:

public interface EmployeeRepository extends CrudRepository { List findAll(); }

All we have to do is define an interface like this, and Spring JPA will provide us with an implementation fleshed out with default and custom operations. Quite neat! Find more details on working with Spring Data JPA in our other articles.

4.3. Controller

Now we have to define a web controller to route and handle our incoming requests:

@RestController public class EmployeeController { @Autowired private EmployeeRepository repository; @GetMapping("/employees") public List getEmployees() { return repository.findAll(); } // Other CRUD endpoints handlers }

Really, all we had to do was annotate the class and define routing meta information along with each handler method.

Working with Spring REST controllers is covered in great details in our previous article.

4.4. Security

So we have defined everything now, but what about securing operations like create or delete employees? We don't want unauthenticated access to those endpoints!

Spring Security really shines in this area:

@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers(HttpMethod.GET, "/employees", "/employees/**") .permitAll() .anyRequest() .authenticated() .and() .httpBasic(); } // other necessary beans and definitions }

There are more details here which require attention to understand but the most important point to note is the declarative manner in which we have only allowed GET operations unrestricted.

4.5. Testing

Now we' have done everything, but wait, how do we test this?

Let's see if Spring can make it easy to write unit tests for REST controllers:

@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc public class EmployeeControllerTests { @Autowired private MockMvc mvc; @Test @WithMockUser() public void givenNoEmployee_whenCreateEmployee_thenEmployeeCreated() throws Exception { mvc.perform(post("/employees").content( new ObjectMapper().writeValueAsString(new Employee("First", "Last")) .with(csrf())) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status() .isCreated()) .andExpect(jsonPath("$.firstName", is("First"))) .andExpect(jsonPath("$.lastName", is("Last"))); } // other tests as necessary }

As we can see, Spring provides us with the necessary infrastructure to write simple unit and integration tests which otherwise depend on the Spring context to be initialized and configured.

4.6. Running the Application

Finally, how do we run this application? This is another interesting aspect of Spring Boot. Although we can package this as a regular application and deploy traditionally on a Servlet container.

But where is fun this that! Spring Boot comes with an embedded Tomcat server:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

This is a class which comes pre-created as part of the bootstrap and has all the necessary details to start this application using the embedded server.

Moreover, this is highly customizable.

5. Alternatives to Spring

While choosing to use a framework is relatively easier, choosing between frameworks can often be daunting with the choices we have. But for that, we must have at least a rough understanding of what alternatives are there for the features that Spring has to offer.

As we discussed previously, the Spring framework together with its projects offer a wide choice for an enterprise developer to pick from. If we do a quick assessment of contemporary Java frameworks, they don't even come close to the ecosystem that Spring provides us.

However, for specific areas, they do form a compelling argument to pick as alternatives:

  • Guice: Offers a robust IoC container for Java applications
  • Play: Quite aptly fits in as a Web framework with reactive support
  • Hibernate: An established framework for data access with JPA support

Other than these there are some recent additions that offer wider support than a specific domain but still do not cover everything that Spring has to offer:

  • Micronaut: A JVM-based framework tailored towards cloud-native microservices
  • Quarkus: A new age Java stack which promises to deliver faster boot time and a smaller footprint

Obviously, it's neither necessary nor feasible to iterate over the list completely but we do get the broad idea here.

6. So, Why Choose Spring?

Finally, we've built all the required context to address our central question, why Spring? We understand the ways a framework can help us in developing complex enterprise applications.

Moreover, we do understand the options we've got for specific concerns like web, data access, integration in terms of framework, especially for Java.

Now, where does Spring shine among all these? Let's explore.

6.1. Usability

One of the key aspects of any framework's popularity is how easy it is for developers to use it. Spring through multiple configuration options and Convention over Configuration makes it really easy for developers to start and then configure exactly what they need.

Projects like Spring Boot have made bootstrapping a complex Spring project almost trivial. Not to mention, it has excellent documentation and tutorials to help anyone get on-boarded.

6.2. Modularity

Another key aspect of Spring's popularity is its highly modular nature. We've options to use the entire Spring framework or just the modules necessary. Moreover, we can optionally include one or more Spring projects depending upon the need.

What's more, we've got the option to use other frameworks like Hibernate or Struts as well!

6.3. Conformance

Although Spring does not support all of Jakarta EE specifications, it supports all of its technologies, often improving the support over the standard specification where necessary. For instance, Spring supports JPA based repositories and hence makes it trivial to switch providers.

Moreover, Spring supports industry specifications like Reactive Stream under Spring Web Reactive and HATEOAS under Spring HATEOAS.

6.4. Testability

Adoption of any framework largely also depends on the fact that how easy it is to test the application built on top of it. Spring at the core advocates and supports Test Driven Development (TDD).

Spring application is mostly composed of POJOs which naturally makes unit testing relatively much simpler. However, Spring does provide Mock Objects for scenarios like MVC where unit testing gets complicated otherwise.

6.5 Maturity

Spring has a long history of innovation, adoption, and standardization. Over the years, it's become mature enough to become a default solution for most common problems faced in the development of large scale enterprise applications.

What's even more exciting is how actively it's being developed and maintained. Support for new language features and enterprise integration solutions are being developed every day.

6.6. Community Support

Last but not least, any framework or even library survive the industry through innovation and there's no better place for innovation than the community. Spring is an open source led by Pivotal Software and backed by a large consortium of organizations and individual developers.

This has meant that it remains contextual and often futuristic, as evident by the number of projects under its umbrella.

7. Reasons Not to Use Spring

There is a wide variety of application which can benefit from a different level of Spring usage, and that is changing as fast as Spring is growing.

However, we must understand that Spring like any other framework is helpful in managing the complexity of application development. It helps us to avoid common pitfalls and keeps the application maintainable as it grows over time.

This comes at the cost of an additional resource footprint and learning curve, however small that may be. If there is really an application which is simple enough and not expected to grow complex, perhaps it may benefit more to not use any framework at all!

8. Conclusion

In this article, we discussed the benefits of using a framework in application development. We further discussed briefly Spring Framework in particular.

While on the subject, we also looked into some of the alternate frameworks available for Java.

Finalmente, discutimos las razones que pueden obligarnos a elegir Spring como el marco de elección para Java.

Sin embargo, deberíamos terminar este artículo con una nota de consejo. Por muy convincente que parezca, por lo general no existe una solución única y única para todos en el desarrollo de software.

Por lo tanto, debemos aplicar nuestra sabiduría al seleccionar la solución más simple para los problemas específicos que pretendemos resolver.