Tag: spring-boot, java, backend, microservices, rest, dependency-injection
Livello: intermedio
TL;DR: Framework per creare applicazioni Java stand-alone di livello enterprise con configurazione minima, embedded server e gestione delle dipendenze semplificata.
Inversion of Control (IoC): il container Spring gestisce il ciclo di vita e l'istanziazione dei bean.
Dependency Injection (DI): iniezione dei componenti via costruttore, setter o campo. Preferire l'iniezione da costruttore.
Auto-configuration: configura automaticamente l'applicazione analizzando i jar presenti nel classpath (@EnableAutoConfiguration).
Spring Boot Starters: descriptor di dipendenze predefiniti che aggregano librerie compatibili (es. spring-boot-starter-web).
Embedded Server: include runtime come Tomcat, Jetty o Undertow evitando deploy su servlet container esterni.
Actuator: fornisce endpoint per monitoraggio, health check, metriche e audit dell'applicazione in esecuzione.
Spring Data JPA: astrazione sopra JPA/Hibernate per operazioni di persistenza tramite repository interfacce-guidate.
Profiles: isolamento delle configurazioni per ambienti distinti (dev, test, prod) tramite application-{profile}.properties.
Q: Qual è la differenza principale tra Spring e Spring Boot?R: Spring offre il framework core e l'infrastruttura IoC/DI richiedendo configurazione manuale, mentre Spring Boot velocizza l'avvio con auto-configurazione, starter dipendenze e server incorporato.
Q: Perché è raccomandata la constructor injection rispetto ad @Autowired su campo?R: La constructor injection rende i bean immutabili, previene i NullPointerException garantendo dipendenze valorizzate e facilita i test unitari senza dover avviare il contesto Spring.
Q: A cosa serve e cosa include l'annotazione @SpringBootApplication?R: È una meta-annotazione che raggruppa @Configuration, @EnableAutoConfiguration e @ComponentScan sul package corrente e i relativi sottopackage.
Q: Come si gestisce l'aggiornamento parziale di una risorsa in un controller REST?R: Implemento un metodo associato ad annotazione @PatchMapping, applicando le sole modifiche presenti nel payload sul model recuperato dal database.
Q: Come si gestiscono le eccezioni globali in un'applicazione Spring Boot REST?R: Utilizzo una classe annotata con @RestControllerAdvice con metodi @ExceptionHandler per intercettare errori specifici e restituire risposte standardizzate.
Posizionamento errato della classe principale: se non si trova nella root dei package, @ComponentScan non rileva i bean.
Dipendenze circolari tra componenti: causano fallimento del contesto all'avvio dell'applicazione.
Transazioni aperte inutilmente: l'uso errato di @Transactional su metodi di sola lettura può saturare il connection pool del database.
Inclusione di endpoint Actuator sensibili in produzione senza un'adeguata sicurezza basata su Spring Security.
Sovrascrittura involontaria di proprietà causata dall'ordine di precedenza delle configurazioni esterne.
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public ResponseEntity<UserResponse> getById(@PathVariable Long id) {
return ResponseEntity.ok(userService.findUserById(id));
}
}
Java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorDetails> handleNotFound(ResourceNotFoundException ex) {
ErrorDetails error = new ErrorDetails(HttpStatus.NOT_FOUND.value(), ex.getMessage());
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
}
Properties
# application.properties
server.port=8080
spring.datasource.url=jdbc:postgresql://localhost:5432/appdb
management.endpoints.web.exposure.include=health,info,metrics
[ ] Meccanismo di caricamento delle annotazioni @ConditionalOnClass e @ConditionalOnMissingBean
[ ] Configurazione e tuning del connection pool HikariCP
[ ] Catena di filtri di sicurezza in Spring Security
[ ] Differenza comportamentale tra propagazione REQUIRED e REQUIRES_NEW in @Transactional