En muchos proyectos con Spring pasa lo mismo:
terminas repitiendo las mismas anotaciones una y otra vez.
@ Service @ Transactional
@ RestController @ RequestMapping("/api/v1/...")
@ Component mil configuraciones más.
Que por cierto Spring 7 ya soporta el versionamiento de apis pero ese es otro tema.
Lo de las anotaciones dunciona… pero el código empieza a llenarse de ruido.
Tienes la semántica del dominio mezclada con detalles técnicos, y encima repites el mismo combo de anotaciones en media aplicación.
Ahí es donde entran las anotaciones compuestas en Spring:
En lugar de repetir siempre las mismas, creas una anotación tuya que ya trae todo empaquetado.
Por ejemplo, en vez de esto:
@ Service
@ Transactional(readOnly = true)
public class GetUserService {
...
}
Puedes hacer esto:
@ ReadOnlyUseCase
public class GetUserService {
...
}
Y definir tu anotación así:
@ Target(ElementType.TYPE)
@ Retention(RetentionPolicy.RUNTIME)
@ Service
@ Transactional(readOnly = true)
public @ interface ReadOnlyUseCase {
}
Te explico este código:
1. @ ReadOnlyUseCase no es mágica, es solo una anotación normal de Java.
2. Pero está “decorada” con @ Service y @ Transactional(readOnly = true).
3. Para Spring, cualquier clase anotada con @ ReadOnlyUseCase es un bean de servicio y además se ejecuta en una transacción de solo lectura.
Acabas de crear una abstracción que habla el lenguaje de tu dominio (“caso de uso de solo lectura”), y al mismo tiempo encapsula detalles técnicos (service transacción).
En teoría esto escala bien:
1. Puedes crear anotaciones para servicios de dominio, adaptadores de infraestructura, controladores públicos, endpoints internos, etc.
2. Puedes expresar intención: @ PublicApi, @ InternalApi, @ DomainService, @ ApplicationService.
3. Y de paso, reduces errores tontos: no se te “olvida” poner @ Transactional o @ Service porque ya vienen incluidos.
Las anotaciones compuestas en Spring no son un truco avanzado, es una forma de que tu código deje de hablar solo de frameworks y empiece a hablar más del negocio que estás modelando.
Esto no es nada nuevo y existe desde hace muchos años, sin embargo puede resultarte bastante útil.