Spring Boot: APIs y Microservicios
Spring Boot es el framework empresarial dominante en Java. Su magia es la Inversión de Control (IoC): en vez de que tu código cree y gestione sus dependencias, Spring las inyecta automáticamente. Marcas una clase con @Service, @Repository o @Component, y Spring la instancia y la inyecta donde la necesites con @Autowired. Esto desacopla completamente las clases entre sí.
Con Spring Boot puedes crear una API REST completa en minutos: @RestController marca una clase como controlador HTTP, @GetMapping/@PostMapping definen endpoints, y @RequestBody/@PathVariable extraen datos de las peticiones. Spring Boot también autodetecta y configura la base de datos, el servidor web (Tomcat embebido), y decenas de componentes sin configuración manual — esto es lo que significa "convention over configuration".
// 1. ENTIDAD — Modelo de datos
import jakarta.persistence.*;
@Entity
@Table(name = "productos")
public class Producto {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nombre;
private double precio;
private int stock;
// Getters y setters...
}
// 2. REPOSITORIO — Acceso a datos (Spring Data JPA)
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductoRepository extends JpaRepository<Producto, Long> {
List<Producto> findByNombreContaining(String texto);
List<Producto> findByPrecioLessThan(double max);
}
// 3. SERVICIO — Lógica de negocio
import org.springframework.stereotype.Service;
@Service
public class ProductoService {
private final ProductoRepository repo;
public ProductoService(ProductoRepository repo) {
this.repo = repo; // Inyección por constructor
}
public List<Producto> buscar(String texto) {
return repo.findByNombreContaining(texto);
}
public Producto crear(Producto producto) {
if (producto.getPrecio() <= 0)
throw new IllegalArgumentException("Precio inválido");
return repo.save(producto);
}
}
// 4. CONTROLADOR — Endpoints REST
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/productos")
public class ProductoController {
private final ProductoService service;
public ProductoController(ProductoService service) {
this.service = service;
}
@GetMapping
public List<Producto> listar() {
return service.buscar("");
}
@PostMapping
public Producto crear(@RequestBody Producto producto) {
return service.crear(producto);
}
@GetMapping("/{id}")
public Producto obtener(@PathVariable Long id) {
return service.repo.findById(id)
.orElseThrow(() -> new RuntimeException("No encontrado"));
}
}
Practica esta lección
Resuelve los ejercicios del curso de Java en la app, gratis y con corrección automática.
Empezar a practicar