Profundizando en Spring Boot
Spring Boot reduce drásticamente la configuración necesaria para levantar una aplicación Spring. Esta guía profundiza en sus piezas clave.
SpringApplication y ciclo de arranque
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplicationagrupa@Configuration,@EnableAutoConfigurationy@ComponentScan.SpringApplicationprepara el entorno, crea el ApplicationContext, procesa eventos y arranca el servidor embebido.
Eventos de arranque
ApplicationStartingEvent,ApplicationReadyEvent,ApplicationFailedEvent.- Implementa
ApplicationListener<?>o usaSpringApplication.addListeners.
Starters
- Agrupan dependencias coherentes (
spring-boot-starter-web,spring-boot-starter-data-jpa,spring-boot-starter-security). - Reducen conflictos y aseguran versiones compatibles gestionadas por el parent POM (
spring-boot-dependencies).
Autoconfiguración
- Spring Boot detecta beans disponibles en el classpath y activa configuraciones condicionadas.
@ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty, etc.
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration { ... }
- Puedes inspeccionar autoconfiguraciones activas con Actuator (
/actuator/conditions) o--debug.
Personalizar configuración
- Properties/YAML (
application.properties,application.yml). - Prefijos tipados con
@ConfigurationProperties.
@ConfigurationProperties(prefix = "app.mail")
public record MailProperties(String host, int port, boolean ssl) {}
@Configuration
@EnableConfigurationProperties(MailProperties.class)
public class MailConfig {}
Perfiles
spring.profiles.active=dev.@Profile("dev"),@Profile({"prod","qa"}).- Propiedades específicas:
application-dev.yml,application-prod.yml.
Jerarquía de configuración
- Propiedades en línea de comandos (
--server.port=8081). - Variables de entorno.
application.yml/application.properties.- Valores por defecto en el código.
Actuator y observabilidad
- Endpoints
/actuator/health,/actuator/info,/actuator/metrics,/actuator/loggers. - Integra con Prometheus (
micrometer-registry-prometheus), Grafana, Zipkin. - Configura niveles:
management:
endpoints:
web:
exposure:
include: health,info,metrics,loggers,threaddump,env,conditions
endpoint:
health:
show-details: when_authorized
Logging
- Usa Logback por defecto (
logback-spring.xml). - Niveles configurables en
application.yml:
logging:
level:
root: INFO
com.demo: DEBUG
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
- Añade apéndices (archivos, syslog, Elasticsearch) con configuraciones específicas.
Seguridad
spring-boot-starter-securityconfigura un filtro básico.- Desactiva/autoconfigura con
SecurityFilterChain. - Integra OAuth2, JWT, Basic Auth, LDAP, SAML.
Testing con Spring Boot
@SpringBootTestcarga el contexto completo.@DataJpaTest,@WebMvcTest,@RestClientTestpara slices específicos.TestRestTemplate,WebTestClient,MockMvcpara pruebas de controladores.
Contenedores y despliegue
mvn spring-boot:run,mvn spring-boot:build-image(Buildpacks).- Dockerfile multi-stage:
FROM eclipse-temurin:21-jdk AS build
WORKDIR /workspace
COPY . .
RUN ./mvnw package -DskipTests
FROM eclipse-temurin:21-jre
COPY --from=build /workspace/target/app.jar /app/app.jar
ENTRYPOINT ["java","-XX:+UseContainerSupport","-jar","/app/app.jar"]
- Perfiles + Config Server + Vault para gestionar secretos en distintos entornos.
Crear autoconfiguraciones propias
- Define un starter interno (
acme-spring-boot-starter). - Registra autoconfiguración en
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. - Usa propiedades tipadas para exponer configuración.
Depuración y tuning
--debugmuestra condiciones evaluadas.spring.main.log-startup-info=falsepara arranque silencioso.- Ajusta
server.tomcat.max-connections,spring.datasource.hikari.maximumPoolSize, etc. springdoc-openapi,GraphQL,Kafka,Batchtienen starters oficiales.
Con estas herramientas puedes exprimir Spring Boot al máximo, manteniendo la productividad sin perder el control fino cuando lo necesitas.