Saltar al contenido principal

Chuleta de anotaciones: Lombok y Spring Framework

Esta página no introduce conceptos nuevos: es una tabla de referencia para consultar durante el desarrollo. Cada anotación enlaza, cuando procede, al apartado donde se explica con detalle. Si necesitas entender el porqué de alguna, ve primero a Inversión de control e inyección de dependencias o a Anatomía de un proyecto Spring Boot.

aviso

[Lombok no sustituye entender qué genera]

En la defensa oral se te puede pedir que expliques qué código genera una anotación de Lombok en concreto. Usarla está bien; no saber qué hace, no.

Lombok​

Lombok genera código repetitivo (getters, setters, constructores...) en tiempo de compilación mediante un procesador de anotaciones. No aporta comportamiento en tiempo de ejecución: si lo quitas del pom.xml, el código deja de compilar, no de funcionar distinto.

Generación de miembros​

AnotaciónGenera
@GetterGetter público para cada campo (o para la clase si se pone a nivel de clase).
@SetterSetter público para cada campo no final.
@ToStringtoString() con el nombre de la clase y sus campos.
@EqualsAndHashCodeequals() y hashCode() basados en los campos.
@NoArgsConstructorConstructor sin argumentos.
@AllArgsConstructorConstructor con todos los campos como parámetros.
@RequiredArgsConstructorConstructor con los campos final y los anotados @NonNull. Es la que usarás para inyección por constructor.

Anotaciones compuestas​

AnotaciónEquivale a
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor.
@ValueComo @Data pero inmutable: campos private final, sin setters, clase final.
aviso

[@Data en entidades JPA]

@Data genera equals()/hashCode() sobre todos los campos, incluidas las relaciones. En una entidad JPA con colecciones asociadas (por ejemplo Expediente con sus Notificacion) eso puede disparar cargas perezosas inesperadas o bucles infinitos si dos entidades se referencian mutuamente. Cuando llegues a la UD4, prefiere anotaciones sueltas (@Getter, @Setter) y un equals()/hashCode() basado sólo en el identificador.

Otras​

AnotaciónUso
@BuilderGenera un patrón builder para construir instancias paso a paso.
@Slf4jInyecta un campo estático log de SLF4J, sin declararlo a mano.
@NonNullEn un parámetro o campo, genera una comprobación de nulidad que lanza NullPointerException si se incumple.

Spring Framework​

Estereotipos y arranque​

Ver también la tabla completa en Los estereotipos.

AnotaciónUso
@ComponentMarca una clase como bean genérico gestionado por Spring.
@ServiceEstereotipo de @Component para la capa de negocio.
@RepositoryEstereotipo de @Component para la capa de persistencia; traduce excepciones a DataAccessException.
@ControllerEstereotipo de @Component para la capa de presentación (vistas).
@RestController@Controller + @ResponseBody: cada método serializa su valor de retorno directamente al cuerpo de la respuesta (JSON).
@ConfigurationLa clase declara beans mediante métodos @Bean.
@SpringBootApplicationAnotación compuesta: @SpringBootConfiguration + @ComponentScan + @EnableAutoConfiguration. Ver Anatomía de un proyecto Spring Boot.

Inyección de dependencias​

AnotaciónUso
@AutowiredMarca un punto de inyección. Innecesaria en un constructor único (ver Formas de inyección). Evita usarla sobre campos.
@Qualifier("nombreBean")Desambigua qué implementación inyectar cuando hay varios beans candidatos.
@PrimaryMarca una implementación como predeterminada entre varias candidatas.
@Value("${propiedad}")Inyecta un valor suelto leído de application.yml.
@ConditionalOnPropertyRegistra el bean sólo si una propiedad de configuración tiene un valor concreto.
@BeanDentro de una clase @Configuration, declara un bean a partir del valor de retorno del método.

Ciclo de vida y ámbito​

AnotaciónUso
@Scope("prototype")Cambia el ámbito de un bean (por defecto es singleton).
@PostConstructMétodo que se ejecuta una vez, justo después de la inyección de dependencias.
@PreDestroyMétodo que se ejecuta al cerrar el contexto, antes de destruir el bean.

Configuración externalizada​

AnotaciónUso
@ConfigurationProperties(prefix = "...")Vincula un grupo de propiedades de application.yml a un record o clase tipada.
@EnableConfigurationPropertiesActiva una clase concreta de @ConfigurationProperties.
@ConfigurationPropertiesScanActiva el escaneo automático de todas las clases @ConfigurationProperties del paquete.
@ValidatedAplica validación de Bean Validation al construir el objeto de propiedades.
@Profile("dev")Restringe un bean o una configuración a un perfil concreto.

Validación (Jakarta Bean Validation)​

Ver Controladores REST y validación de entrada para la tabla completa y ejemplos.

AnotaciónUso
@NotNullEl valor no puede ser null.
@NotBlankEl String no puede ser null, vacío ni sólo espacios.
@NotEmptyLa colección o String no puede ser null ni estar vacía.
@Size(min=, max=)Longitud o tamaño dentro de un rango.
@Min / @Max / @DecimalMin / @DecimalMaxValor numérico dentro de un rango.
@Positive / @PositiveOrZeroEl número es (estrictamente) positivo.
@Pattern(regexp=)El String coincide con una expresión regular.
@EmailEl String tiene forma de correo electrónico.
@Past / @FutureLa fecha es anterior / posterior al momento actual.
@ValidEn un parámetro de controlador o campo anidado, activa la validación en cascada. Sin ella, las anotaciones anteriores no se evalúan.

Web (Spring MVC)​

Ver Controladores REST y validación de entrada para el ejemplo completo con DTO, controlador y manejador de errores.

AnotaciónUso
@RequestMappingDefine la ruta base de un controlador o de un método.
@GetMapping / @PostMapping / @PutMapping / @DeleteMappingAtajos de @RequestMapping para cada verbo HTTP.
@PathVariableVincula un fragmento de la ruta a un parámetro del método.
@RequestParamVincula un parámetro de la query string a un parámetro del método.
@RequestBodyDeserializa el cuerpo de la petición (JSON) al tipo del parámetro.
@ResponseStatusFija el código HTTP de la respuesta.
@RestControllerAdviceAplica sus @ExceptionHandler a todos los controladores de la aplicación.
@ExceptionHandler(Tipo.class)Método que se ejecuta cuando ese tipo de excepción escapa de un controlador.
nota

[¿Dónde está @Transactional?]

No aparece en esta tabla porque su comportamiento — gestión de transacciones, rollback automático — se explica en detalle en la UD3, cuando trabajemos JDBC y JPA. Aquí sólo la nombramos para que la reconozcas cuando aparezca.