Domande di colloquio per sviluppatori backend (Java): Guida completa

Milad Bonakdar
Autore
Padroneggia lo sviluppo backend Java con domande essenziali per il colloquio che riguardano Spring Boot, Microservizi, JPA e progettazione di sistemi. Preparazione perfetta per i colloqui da sviluppatore Java.
Introduzione
Java rimane una potenza nel mondo del backend enterprise, specialmente con il moderno ecosistema Spring Boot. La sua robustezza, scalabilità e vasto ecosistema lo rendono una scelta eccellente per la creazione di microservizi e applicazioni cloud-native.
Questa guida copre le domande essenziali per i colloqui per gli sviluppatori Backend specializzati in Java e Spring Boot. Esploreremo i concetti fondamentali del framework, l'architettura dei microservizi, le interazioni con il database tramite JPA/Hibernate e le migliori pratiche per aiutarti a prepararti per il tuo prossimo colloquio.
Concetti fondamentali di Spring Boot
1. Cos'è Spring Boot e in cosa differisce dal tradizionale Spring Framework?
Risposta:
- Spring Framework: Un framework completo per lo sviluppo Java enterprise. Richiede una significativa configurazione manuale (basata su XML o Java) per l'installazione.
- Spring Boot: Un'estensione dello Spring Framework che semplifica la configurazione e lo sviluppo di nuove applicazioni Spring.
- Auto-Configurazione: Configura automaticamente i bean in base alle dipendenze del classpath.
- Server incorporati: Include Tomcat, Jetty o Undertow, quindi non è necessario distribuire file WAR.
- Starter: Dipendenze curate per semplificare la configurazione della build.
- Impostazioni predefinite opinabili: Approccio "Convenzione sulla configurazione".
Rarità: Comune Difficoltà: Facile
2. Spiega l'annotazione @SpringBootApplication.
Risposta: È un'annotazione di convenienza che combina altre tre annotazioni:
@Configuration: Contrassegna la classe come origine delle definizioni dei bean.@EnableAutoConfiguration: Indica a Spring Boot di iniziare ad aggiungere bean in base alle impostazioni del classpath, ad altri bean e a varie impostazioni delle proprietà.@ComponentScan: Indica a Spring di cercare altri componenti, configurazioni e servizi nel pacchetto corrente e nei sottopacchetti.
Rarità: Comune Difficoltà: Facile
3. Cosa sono l'Dependency Injection (DI) e l'Inversion of Control (IoC)?
Risposta:
- IoC: Un principio in cui il controllo della creazione e della gestione degli oggetti viene trasferito dal programmatore a un contenitore (Spring IoC Container).
- DI: Un modello di progettazione utilizzato per implementare IoC. Invece che un oggetto crei le sue dipendenze, queste vengono "iniettate" in esso (tramite Costruttore, Setter o Campo).
- Vantaggio: Disaccoppiamento, test più semplici (dipendenze di mocking) e migliore manutenibilità.
Rarità: Molto comune Difficoltà: Media
4. Cosa sono gli Spring Boot Starter? Fai degli esempi.
Risposta: Gli Starter sono un insieme di descrittori di dipendenza convenienti che puoi includere nella tua applicazione. Contengono tutte le dipendenze necessarie per avviare rapidamente un progetto con un insieme coerente e supportato di dipendenze transitive gestite.
- Esempi:
spring-boot-starter-web: Per la creazione di applicazioni web (include Tomcat e Spring MVC).spring-boot-starter-data-jpa: Per l'utilizzo di Spring Data JPA con Hibernate.spring-boot-starter-test: Per i test (include JUnit, Mockito).spring-boot-starter-security: Per Spring Security.
Rarità: Comune Difficoltà: Facile
5. Cos'è Spring Actuator?
Risposta: Spring Boot Actuator fornisce funzionalità pronte per la produzione per aiutarti a monitorare e gestire la tua applicazione.
- Endpoint: Espone endpoint come
/health(stato dell'app),/metrics(memoria, utilizzo della CPU),/info(informazioni sull'app),/env(proprietà dell'ambiente). - Utilizzo: Fondamentale per i team operativi per controllare lo stato di salute dei microservizi in produzione.
Rarità: Comune Difficoltà: Media
Microservizi e architettura
6. Quali sono i vantaggi dei microservizi rispetto all'architettura monolitica?
Risposta:
- Scalabilità: I singoli servizi possono essere scalati indipendentemente in base alla domanda.
- Agnosticismo tecnologico: Servizi diversi possono utilizzare tecnologie diverse (Java, Go, Python) più adatte all'attività.
- Isolamento dei guasti: Un guasto in un servizio non comporta necessariamente l'arresto dell'intero sistema.
- Distribuzione indipendente: I team possono distribuire i servizi in modo indipendente, consentendo cicli di rilascio più rapidi (CI/CD).
Rarità: Comune Difficoltà: Media
7. Cos'è un API Gateway? Perché usarlo?
Risposta: Un API Gateway è un server che funge da singolo punto di ingresso nel sistema. Prende tutte le chiamate API dai client, quindi le indirizza al microservizio appropriato.
- Funzioni: Routing delle richieste, composizione e traduzione del protocollo.
- Preoccupazioni trasversali: Autenticazione, terminazione SSL, limitazione della velocità, memorizzazione nella cache, registrazione.
- Esempi: Spring Cloud Gateway, Netflix Zuul, Kong.
Rarità: Molto comune Difficoltà: Media
8. Spiega Service Discovery (Eureka).
Risposta: In un ambiente di microservizi, le istanze di servizio hanno indirizzi IP dinamici. Service Discovery è un meccanismo per i servizi per trovarsi l'un l'altro.
- Eureka Server: Funge da registro dei servizi.
- Eureka Client: I microservizi si registrano con Eureka Server all'avvio e inviano heartbeat.
- Discovery: Quando il Servizio A deve chiamare il Servizio B, chiede a Eureka l'indirizzo del Servizio B.
Rarità: Comune Difficoltà: Media
9. Cos'è il Circuit Breaker Pattern?
Risposta: Il modello Circuit Breaker impedisce a un'applicazione di provare ripetutamente a eseguire un'operazione che probabilmente fallirà (ad esempio, chiamare un servizio inattivo).
- Stati:
- Closed: Le richieste fluiscono normalmente.
- Open: Le richieste vengono bloccate immediatamente (fail fast) per consentire al servizio in errore di riprendersi.
- Half-Open: Un numero limitato di richieste viene consentito per verificare se il servizio è stato ripristinato.
- Strumenti: Resilience4j (consigliato), Hystrix (deprecato).
Rarità: Molto comune Difficoltà: Difficile
Database e JPA
10. Cosa sono JPA e Hibernate?
Risposta:
- JPA (Java Persistence API): Una specifica per l'accesso, la persistenza e la gestione dei dati tra oggetti Java e un database relazionale. È solo un'interfaccia.
- Hibernate: L'implementazione più popolare della specifica JPA. È uno strumento ORM (Object-Relational Mapping).
Rarità: Comune Difficoltà: Facile
11. Spiega il problema N+1 Select in Hibernate.
Risposta: Il problema N+1 si verifica quando il framework di accesso ai dati esegue N istruzioni SQL aggiuntive per recuperare gli stessi dati che avrebbero potuto essere recuperati durante l'esecuzione della query SQL principale.
- Scenario: Recupero di un elenco di
Author(1 query). Iterazione e accesso aauthor.getBooks()(N query, una per ogni autore). - Soluzione: Utilizzare Join Fetch in JPQL (
SELECT a FROM Author a JOIN FETCH a.books) o Entity Graphs per caricare le entità correlate eager in una singola query.
Rarità: Molto comune Difficoltà: Media
12. Qual è la differenza tra @Entity, @Table e @Column?
Risposta:
@Entity: Specifica che la classe è un'entità ed è mappata a una tabella di database.@Table: Opzionale. Specifica il nome della tabella di database da utilizzare per la mappatura. Se omesso, viene utilizzato il nome della classe.@Column: Opzionale. Specifica i dettagli della colonna a cui verrà mappato un campo o una proprietà. Se omesso, viene utilizzato il nome del campo.
Rarità: Comune Difficoltà: Facile
Sicurezza e test
13. Come proteggere un'applicazione Spring Boot?
Risposta: Utilizzando Spring Security.
- Autenticazione: Verifica chi è l'utente (ad esempio, Basic Auth, Form Login, OAuth2/OIDC).
- Autorizzazione: Verifica cosa è consentito all'utente (ad esempio, controllo degli accessi basato sui ruoli utilizzando
@PreAuthorize). - JWT: Per i microservizi stateless, i JSON Web Token vengono comunemente utilizzati per trasmettere l'identità tra i servizi.
Rarità: Comune Difficoltà: Media
14. Qual è la differenza tra @Mock e @InjectMocks in Mockito?
Risposta:
@Mock: Crea un oggetto mock della classe/interfaccia. Non ha alcun comportamento reale; si definisce il suo comportamento usandowhen(...).thenReturn(...).@InjectMocks: Crea un'istanza della classe e inietta in questa istanza i mock creati con le annotazioni@Mock(o@Spy). Utilizzato per la classe in fase di test.
Rarità: Comune Difficoltà: Media
15. Come gestire le transazioni in Spring Boot?
Risposta:
Utilizzando l'annotazione @Transactional.
- Meccanismo: Spring crea un proxy attorno alla classe/metodo. Avvia una transazione prima dell'esecuzione del metodo e la esegue dopo che il metodo restituisce. Se viene generata una
RuntimeException, esegue il rollback della transazione. - Propagation: È possibile configurare come la transazione si relaziona alle transazioni esistenti (ad esempio,
REQUIRED,REQUIRES_NEW).
Rarità: Comune Difficoltà: Media
Argomenti avanzati
16. Cos'è Spring Cloud Config?
Risposta: Spring Cloud Config fornisce supporto lato server e lato client per la configurazione esterna in un sistema distribuito.
- Config Server: Luogo centrale per gestire le proprietà esterne per le applicazioni in tutti gli ambienti. Può essere supportato da Git, SVN o Vault.
- Vantaggio: È possibile modificare la configurazione senza ridistribuire l'applicazione (utilizzando
@RefreshScope).
Rarità: Non comune Difficoltà: Media
17. Spiega la differenza tra scope Singleton e Prototype in Spring Beans.
Risposta:
- Singleton (Predefinito): Viene creata una sola istanza del bean per ogni contenitore Spring IoC. Viene memorizzato nella cache e riutilizzato.
- Prototype: Viene creata una nuova istanza ogni volta che viene richiesto il bean.
- Altri: Request, Session (scope web-aware).
Rarità: Comune Difficoltà: Facile
18. Qual è la differenza tra eccezioni Checked e Unchecked in Java?
Risposta:
- Eccezioni checked: Ereditano da
Exception(ma non daRuntimeException). Il compilatore ti obbliga a gestirle (try-catch) o a dichiararle (throws). Esempio:IOException,SQLException. Rappresentano condizioni recuperabili. - Eccezioni unchecked: Ereditano da
RuntimeException. Il compilatore non ti obbliga a gestirle. Esempio:NullPointerException,IllegalArgumentException. Rappresentano errori di programmazione. L'annotazione@Transactionaldi Spring esegue il rollback solo in caso di eccezioni non controllate per impostazione predefinita.
Rarità: Comune Difficoltà: Facile
19. Come funziona il Garbage Collection in Java?
Risposta: Il Garbage Collection (GC) è il processo di recupero automatico della memoria occupata da oggetti che non sono più raggiungibili.
- Ipotesi generazionale: La maggior parte degli oggetti muore giovane.
- Struttura dell'Heap: Young Generation (Eden, Survivor spaces) e Old Generation.
- Minor GC: Pulisce Young Gen. Veloce.
- Major/Full GC: Pulisce Old Gen. Più lento, può causare pause "Stop-the-world".
- Algoritmi: G1GC (predefinito in Java moderno), ZGC, Shenandoah (bassa latenza).
Rarità: Comune Difficoltà: Difficile
20. Cosa sono gli Java Stream?
Risposta: Introdotti in Java 8, gli Stream forniscono un approccio funzionale all'elaborazione di raccolte di oggetti.
- Caratteristiche: Dichiarativo, Pipelining, Iterazione interna.
- Operazioni:
- Intermedie:
filter,map,sorted(lazy). - Terminali:
collect,forEach,reduce(attivano l'elaborazione).
- Intermedie:
- Parallel Streams: Possono elaborare i dati in parallelo utilizzando più thread (
.parallelStream()).
Rarità: Comune Difficoltà: Media



