Spring Framework y Spring Boot
Spring Framework aporta infraestructura modular: contenedor de objetos, inyección de dependencias, Spring MVC y transacciones, entre otras piezas.
Spring Boot agrega auto-configuración, starters para dependencias comunes, configuración externa y formas convenientes de ejecutar y empaquetar una aplicación Spring.
Una comparación útil desde TypeScript es Spring Boot ≈ NestJS: ambos ayudan a estructurar aplicaciones de servidor, reciben peticiones en controladores y permiten inyectar servicios. No son equivalentes exactos; Spring Boot está construido sobre Spring y se ejecuta en la JVM, mientras NestJS se ejecuta sobre Node.js.
Crear un proyecto con Spring Initializr
La opción Spring Boot de IntelliJ abre un generador que prepara el esqueleto, el sistema de construcción y las dependencias iniciales. No es otro lenguaje: el código de la aplicación puede ser Java.
| Campo | Qué define | Un valor inicial razonable |
|---|---|---|
| Type | Herramienta que descarga dependencias y compila el proyecto. Maven usa pom.xml; Gradle Groovy usa build.gradle; Gradle Kotlin usa build.gradle.kts. |
Maven si el curso o equipo no exige otra opción. |
| Language | Lenguaje de la aplicación. | Java. |
| Spring Boot | Versión del framework y sus dependencias compatibles. | Una versión estable que ofrezca el generador; evita versiones SNAPSHOT al empezar. |
| JDK | Java Development Kit: compilador y herramientas para desarrollar y ejecutar Java. La selección también define la versión objetivo del proyecto. | El JDK instalado que sea compatible con la versión de Spring Boot seleccionada. |
| Packaging | Formato de salida. Un JAR de Spring Boot suele poder ejecutarse con el servidor web incluido; WAR se usa cuando el destino requiere un contenedor externo o una configuración WAR. | JAR para una aplicación nueva que se ejecutará por su cuenta. |
| Configuration | Formato del archivo de configuración: application.properties o application.yml. YAML se pronuncia “yamel”. |
El que use el curso o el equipo; ambos expresan propiedades de Spring Boot. |
JDK significa Java Development Kit. Incluye javac y otras herramientas de desarrollo; no es solo el número de versión. Comprueba que IntelliJ tenga instalado el JDK seleccionado y que esa versión sea compatible con la versión de Spring Boot elegida.
Group, Artifact, Name y Package Name
Estos campos identifican y nombran el proyecto. Como ejemplo para una API de inventario:
| Campo | Ejemplo | Para qué sirve |
|---|---|---|
| Group | com.andre |
Identifica el grupo o espacio de nombres del proyecto; suele seguir el dominio invertido. También se usa como base del paquete Java. |
| Artifact | inventario-api |
Identifica este módulo en Maven/Gradle y forma parte del nombre del archivo construido. |
| Name | inventario-api |
Nombre legible del proyecto; Initializr lo usa para generar nombres iniciales, como la clase principal. |
| Package Name | com.andre.inventario |
Paquete raíz de las clases Java. Se escribe en minúsculas y no lleva guiones. |
Group y Package Name suelen estar relacionados, pero no tienen que ser idénticos. Usa un nombre propio del proyecto en vez de dejar com.example cuando ya conozcas el dominio o la organización.
Dependencies
Son librerías iniciales, normalmente agrupadas como starters. Para una primera API REST, selecciona Spring Web. Añade Spring Data JPA y el driver de la base de datos cuando realmente vayas a persistir datos; Validation sirve para validar entradas. Puedes añadir dependencias después, así que empieza con las que necesitas ahora.
Configuración de ejemplo
El mismo valor puede escribirse en cualquiera de los dos formatos:
# application.properties
spring.application.name=inventario-api
server.port=8080
# application.yml
spring:
application:
name: inventario-api
server:
port: 8080
YAML agrupa visualmente claves relacionadas con indentación; properties escribe pares clave=valor. Respeta la indentación de YAML.
Qué elegir para empezar
Si no tienes requisitos de un curso o equipo, una combinación sencilla es Java + Maven + JAR + Spring Web. Elige el JDK compatible que tengas instalado. Para el archivo de configuración, usa properties o YAML según cuál quieras aprender; la elección no cambia las capacidades de la aplicación.
Sigue una petición
HTTP request
→ Controller ruta, entrada y respuesta HTTP
→ Service reglas / caso de uso
→ Repository acceso a persistencia
→ Database
← DTO / response
Las capas son una convención, no una obligación universal. Busca una ruta parecida y sigue los patrones de ese repositorio.
Inversión de control e inyección
Inversión de control: el framework administra la creación y el ciclo de vida de los componentes.
Inyección de dependencias: una clase recibe desde fuera los objetos que necesita. La inyección por constructor deja visible ese contrato y facilita probar la clase.
@Service
public class OrderService {
private final OrderRepository repository;
public OrderService(OrderRepository repository) {
this.repository = repository;
}
}
Anotaciones que encontrarás
@SpringBootApplication: configuración y punto de entrada de Spring Boot.@RestController,@GetMapping,@PostMapping: controladores y rutas HTTP.@Service,@Repository: componentes con un rol reconocible.@Configuration,@Bean: configuración explícita de objetos.@Transactional: define un límite transaccional; revisa su alcance real.
Desde NestJS, la forma general del recorrido puede resultar familiar:
| NestJS / TypeScript | Spring Boot / Java | Función |
|---|---|---|
@Controller('usuarios') |
@RestController + @RequestMapping("/usuarios") |
Recibir peticiones HTTP. |
@Get() / @Post() |
@GetMapping / @PostMapping |
Mapear un método HTTP. |
@Param('id') |
@PathVariable |
Leer un segmento de la ruta. |
@Query('q') |
@RequestParam |
Leer un parámetro de consulta. |
@Body() |
@RequestBody |
Leer el cuerpo de la petición. |
@Injectable() |
@Service (entre otros componentes Spring) |
Registrar un objeto para inyección. |
La inyección por constructor también existe en ambos ecosistemas. En Spring, si una clase tiene un único constructor, normalmente no hace falta anotar ese constructor con @Autowired.
@RestController
@RequestMapping("/saludo")
public class SaludoController {
@GetMapping
public String saludar(@RequestParam(defaultValue = "mundo") String nombre) {
return "Hola, " + nombre;
}
}
La ruta sería GET /saludo?nombre=Ana. @RequestParam corresponde al query parameter; para una ruta como /usuarios/42, se usaría @PathVariable.
Sintaxis Java desde TypeScript
La lógica de if, for, clases e interfaces puede parecer familiar. En Java el tipo se escribe antes del nombre y un método declara su visibilidad, tipo de retorno y parámetros.
| TypeScript | Java |
|---|---|
string |
String |
number |
int, long, double u otro tipo numérico según el dato |
boolean |
boolean |
const |
final para una variable que no se reasigna |
console.log(x) |
System.out.println(x) |
null / undefined |
null solo es una analogía parcial; Java no tiene undefined |
function sumar(a: number, b: number): number {
return a + b;
}
public int sumar(int a, int b) {
return a + b;
}
Una comparación de herramientas también es aproximada: Maven y pom.xml administran dependencias y compilación, mientras npm y package.json administran paquetes y scripts de JavaScript/TypeScript. Java compila a bytecode que ejecuta la JVM; TypeScript se transforma a JavaScript.
Lombok
Lombok genera código durante la compilación. Por eso un constructor, getter o logger puede no estar escrito en el archivo fuente.
@RequiredArgsConstructorgenera un constructor para los camposfinalque requieren inicialización.@Getter/@Settergeneran métodos de acceso.@Slf4jgenera el loggerlog.@Datacombina getters, setters,equals,hashCode,toStringy un constructor requerido. Revisa los efectos antes de usarlo en entidades.
Si el editor marca errores que no aparecen al compilar, revisa el plugin de Lombok y el procesamiento de anotaciones.
MapStruct
MapStruct genera implementaciones de mappers tipados durante la compilación. Se usa para convertir DTOs y modelos.
@Mapper(componentModel = "spring")
public interface UserMapper {
UserDto toDto(User source);
User toEntity(CreateUserRequest source);
}
Busca la configuración del procesador de anotaciones y las asignaciones explícitas para campos con nombres diferentes.
Excepciones y HTTP
Las excepciones pueden modelar fallos de un caso de uso. Una clase anotada con @RestControllerAdvice suele traducirlas a respuestas HTTP coherentes. No captures una excepción para ocultarla o responder con un valor vacío si el contrato no lo pide.
Recursos oficiales
- Spring Initializr genera el esqueleto del proyecto.
- Requisitos de Spring Boot: compatibilidad de Java por versión.
- Ejecutar una aplicación Spring Boot: ejecución del JAR y notas sobre WAR.