¿Qué es Spring Boot?

Spring es un framework alternativo al stack de tecnologías estándar en aplicaciones JavaEE. Nació en una época en la que las tecnologías estándar JavaEE y la visión "oficial" de lo que debía ser una aplicación Java Enterprise tenían todavía muchas aristas por pulir. Los servidores de aplicaciones eran monstruosos devoradores de recursos y los EJB eran pesados, inflexibles y era demasiado complejo trabajar con ellos. En ese contexto, Spring popularizó ideas como la inyección de dependencias o el uso de objetos convencionales (POJOs) como objetos de negocio, que suponían un soplo de aire fresco. Estas ideas permitían un desarrollo más sencillo y rápido y unas aplicaciones más ligeras. Eso posibilitó que de ser un framework inicialmente diseñado para la capa de negocio pasara a ser un completo stack de tecnologías para todas las capas de la aplicación.
Básicamente, la mayor diferencia práctica que podemos encontrar hoy en día entre desarrollar con Spring y con JavaEE estándar es la posibilidad de usar un servidor web convencional al estilo Tomcat para desplegar la aplicación. 

Spring se puede ver como un soporte que nos proporciona tres elementos básicos:

• Servicios enterprise: podemos hacer de manera sencilla que un objeto sea transaccional, o que su acceso esté restringido a ciertos roles, o que sea accesible de manera remota y transparente para el desarrollador, o acceder a otros muchos servicios más, sin tener que escribir el código de manera manual. En la mayoría de los casos solo es necesario anotar el objeto.

• Estereotipos configurables para los objetos de nuestra aplicación: podemos anotar nuestras clases indicando por ejemplo que pertenecen a la capa de negocio o de acceso a datos. Se dice que son configurables porque podemos definir nuestros propios estereotipos "a medida": por ejemplo podríamos definir un nuevo estereotipo que indicara un objeto de negocio que además sería cacheable automáticamente y con acceso restringido a usuarios con determinado rol.

• Inyeccion de dependencias: ya hemos visto este concepto cuando se hablaba de CDI de JavaEE. La inyección de dependencias nos permite solucionar de forma sencilla y elegante cómo proporcionar a un objeto cliente acceso a un objeto que da un servicio que este necesita. Por ejemplo, que un objeto de la capa de presentación se pueda comunicar con uno de negocio. En Spring las dependencias se pueden definir con anotaciones o con XML.
 

A continuación he creado una lista breve sobre las anotaciones que utilizaré en una práctica sobre servicios REST usando Spring boot, para que cuando las leáis sepáis más o menos a qué hacen referencia y porqué se usan.

@Required: Esta anotación se aplica a los métodos de “setters” de beans. Si se considera un escenario en el se que necesita hacer cumplir una propiedad requerida. Indica que el bean afectado debe llenarse en el momento de la configuración con la propiedad requerida. Sino, se genera una excepción de tipo BeanInitializationException.

Anotaciones en Spring Framework

@Component se usa en clases para indicar un componente Spring. La anotación @Component marca la clase Java como un bean o componente para que el mecanismo de exploración de componentes de Spring pueda agregarla al contexto de la aplicación.

@Controller se usa para indicar que la clase es un controlador Spring. Esta anotación se puede utilizar para identificar controladores para Spring MVC o Spring WebFlux.

@Repository se utiliza en clases Java que acceden directamente a la base de datos. La anotación @Repository funciona como un marcador para cualquier clase que cumpla la función de repositorio u Objeto de acceso a datos.

Esta anotación tiene una función de traducción automática. Por ejemplo, cuando ocurre una excepción en el @Repository, hay un controlador para esa excepción y no es necesario agregar un bloque try-catch.

 

 

Spring MVC y anotaciones REST 

@Controller se utiliza en clases Java que desempeñan el papel de controlador en su aplicación. Permite la autodetección de clases de componentes en el classpath y las definiciones de bean de registro automático para ellas. Para habilitar la detección automática de dichos controladores anotados, puede agregar el escaneo de componentes a su configuración. La clase Java anotada con @Controller es capaz de manejar múltiples asignaciones de solicitudes.

Esta anotación se puede usar con Spring MVC y Spring WebFlux.

@RequestMapping se usa tanto a nivel de clase como de método. Se utiliza para asignar solicitudes web a clases de manejador y métodos de manejador específicos. Cuando @RequestMapping se usa en el nivel de clase, crea un URI base para el que se usará el controlador. Cuando esta anotación se utiliza en los métodos, le dará el URI en el que se ejecutarán los métodos del controlador. A partir de esto, puede inferir que la asignación de solicitud a nivel de clase seguirá siendo la misma, mientras que cada método de controlador tendrá su propia asignación de solicitud.

A veces es posible que desee realizar diferentes operaciones en función del método HTTP utilizado, aunque el URI de la solicitud puede permanecer igual. En tales situaciones, puede usar el atributo de método de @RequestMapping con un valor de método HTTP para limitar los métodos HTTP para invocar los métodos de su clase. Por ejemplo: @RequestMapping("/clientes")

Spring Framework 4.3 introdujo las siguientes variantes de nivel de método de la anotación @RequestMapping para expresar mejor la semántica de los métodos anotados. El uso de estas anotaciones se ha convertido en el método estándar para definir los puntos finales. Actúan como envoltorios para @RequestMapping.

Estas anotaciones se pueden usar con Spring MVC y Spring WebFlux.

@GetMapping se utiliza para asignar solicitudes HTTP GET a métodos de controlador específicos. @GetMapping es una anotación compuesta que actúa como un acceso directo para @RequestMapping (method = RequestMethod.GET).

@PostMapping se utiliza para asignar solicitudes HTTP POST a métodos de controlador específicos. @PostMapping es una anotación compuesta que actúa como un acceso directo para @RequestMapping (method = RequestMethod.POST).

@PutMapping se utiliza para mapear solicitudes HTTP PUT en métodos de manejador específicos. @PutMapping es una anotación compuesta que actúa como un acceso directo para @RequestMapping (method = RequestMethod.PUT).

@PatchMapping  se usa para mapear solicitudes HTTP PATCH en métodos de manejador específicos. @PatchMapping es una anotación compuesta que actúa como un acceso directo para @RequestMapping (method = RequestMethod.PATCH).

@DeleteMapping  se usa para asignar solicitudes HTTP DELETE a métodos de controlador específicos. @DeleteMapping es una anotación compuesta que actúa como un acceso directo para @RequestMapping (method = RequestMethod.DELETE).

@ExceptionHandler se usa a nivel de método para manejar excepciones a nivel de controlador. La anotación @ExceptionHandler se usa para definir la clase de excepción que atrapará. Puede usar esta anotación en los métodos que deben invocarse para manejar una excepción. Los valores de @ExceptionHandler se pueden establecer en una matriz de tipos de excepción. Si se produce una excepción que coincide con uno de los tipos de la lista, se invocará el método anotado con el @ExceptionHandler correspondiente.

@PathVariable  se utiliza para anotar argumentos del método del controlador de solicitudes.

La anotación @RequestMapping se puede usar para manejar cambios dinámicos en el URI donde un cierto valor de URI actúa como parámetro. Puede especificar este parámetro usando una expresión regular. La anotación @PathVariable se puede usar para declarar este parámetro.

@RequestBody se utiliza para anotar argumentos del método del controlador de solicitudes. La anotación @RequestBody indica que un parámetro de método debe estar vinculado al valor del cuerpo de la solicitud HTTP. El HttpMessageConveter es responsable de convertir del mensaje de solicitud HTTP a objeto.

@RequestHeader n se utiliza para anotar argumentos del método del controlador de solicitudes.

La anotación @RequestHeader se usa para asignar el parámetro del controlador para solicitar el valor del encabezado. Cuando Spring asigna la solicitud, @RequestHeader verifica el encabezado con el nombre especificado dentro de la anotación y vincula su valor al parámetro del método del controlador. Esta anotación le ayuda a obtener los detalles del encabezado dentro de la clase de controlador.

@ResponseBody se utiliza para anotar métodos de manejo de solicitudes. La anotación @ResponseBody es similar a la anotación @RequestBody. La anotación @ResponseBody indica que el tipo de resultado debe escribirse directamente en el cuerpo de la respuesta en cualquier formato que especifique, como JSON o XML. Spring convierte el objeto devuelto en un cuerpo de respuesta mediante el HttpMessageConveter.

@ResponseStatus se utiliza en métodos y clases de excepción. @ResponseStatus marca un método o clase de excepción con un código de estado y un motivo que debe devolverse. Cuando se invoca el método del controlador, el código de estado se establece en la respuesta HTTP que anula la información de estado proporcionada por cualquier otro medio. Una clase de controlador también se puede anotar con @ResponseStatus, que luego se hereda con todos los métodos @RequestMapping.

@ControllerAdvice  se aplica a nivel de clase. Como se explicó anteriormente, para cada controlador, puede usar @ExceptionHandler en un método que se llamará cuando ocurra una excepción dada. Pero esto maneja solo aquellas excepciones que ocurren dentro del controlador en el que está definido. Para superar este problema, ahora puede usar la anotación @ControllerAdvice. Esta anotación se utiliza para definir los métodos @ExceptionHandler, @InitBinder y @ModelAttribute que se aplican a todos los métodos @RequestMapping. Por lo tanto, si define la anotación @ExceptionHandler en un método en una clase @ControllerAdvice, se aplicará a todos los controladores.

@RestController se usa a nivel de clase. La anotación @RestController marca la clase como un controlador donde cada método devuelve un objeto de dominio en lugar de una vista. Al anotar una clase con esta anotación, ya no necesita agregar @ResponseBody a todos los métodos RequestMapping. Significa que ya no usa resuelve vistas ni envía HTML en respuesta. Simplemente envía el objeto de dominio como una respuesta HTTP en el formato que entienden los consumidores, como JSON.

Existen un montón de anotaciones, si tienes más curiosidad puedes investigar sobre ellos. por ejemplo en esta web aunque hay un montón de web donde te explican un poco todo.