Domande e risposte per colloqui Spring

I have posted a lot of Spring Tutorials recently. This post will help you get through Spring interview Questions explaining the core concepts in detail.

Il framework Spring è uno dei framework Java EE più popolari per le applicazioni web. L’Injection di Dipendenza e la Programmazione Orientata agli Aspetti sono al cuore del framework Spring. Se si ha esperienza con il framework Spring, le probabilità di essere selezionati in un colloquio di lavoro per Java aumentano notevolmente.

Suggerimento professionale: Java di base è la base di qualsiasi framework basato su Java, quindi se ci si sta preparando per un colloquio di lavoro, si consiglia di leggere gli articoli sulle domande di colloquio su Java di base e sulle domande di colloquio su Java.

Domande e risposte per un colloquio su Spring

Qui fornisco quasi 50 domande per un colloquio su Spring e le relative risposte. È aggiornato fino alla versione Spring 5, quindi include tutte le ultime funzionalità come Spring WebFlux per la programmazione reattiva.

1. Cos’è il framework Spring?

Spring è uno dei framework Java EE più ampiamente utilizzati. I concetti principali del framework Spring sono “Dependency Injection” e “Aspect-Oriented Programming”.

Il framework Spring può essere utilizzato anche nelle normali applicazioni Java per ottenere un accoppiamento debole tra diversi componenti implementando l’iniezione delle dipendenze. Possiamo eseguire compiti trasversali come il logging e l’autenticazione utilizzando il supporto di Spring per la programmazione orientata agli aspetti.

I like spring because it provides a lot of features and different modules for specific tasks such as Spring MVC and Spring JDBC. Since it’s an open-source framework with a lot of online resources and active community members, working with the Spring framework is easy and fun at the same time.

Lettura consigliata: Spring Framework

2. Quali sono alcune delle caratteristiche importanti del framework Spring?

Il framework Spring è costruito su due concetti di design: Dependency Injection e Aspect-Oriented Programming.

Alcune delle caratteristiche del framework Spring sono:

  • Leggero e con pochissimo overhead nell’utilizzo di un framework per lo sviluppo.
  • Dependency Injection o Inversione di Controllo per scrivere componenti che sono indipendenti l’uno dall’altro, il contenitore Spring si occupa di collegarli insieme per realizzare il nostro lavoro.
  • Il contenitore Spring IoC gestisce il ciclo di vita del bean di Spring e le configurazioni specifiche del progetto come la ricerca JNDI.
  • Il framework Spring MVC può essere utilizzato per creare applicazioni web e servizi web REST capaci di restituire risposte XML e JSON.
  • Supporta la gestione delle transazioni, le operazioni JDBC, l’upload di file, la gestione delle eccezioni, ecc. con poche configurazioni, utilizzando annotazioni o file di configurazione dei bean di Spring.

3. Qual è il vantaggio nell’utilizzare il framework Spring?

Alcuni dei vantaggi nell’utilizzare il framework Spring sono:

  • Riduzione delle dipendenze dirette tra diversi componenti dell’applicazione. Il contenitore Spring IoC si occupa di inizializzare le risorse o i bean e di iniettarli come dipendenze.
  • Scrivere casi di test unitari è facile nel framework Spring perché la nostra logica di business non ha dipendenze dirette dalle classi di implementazione delle risorse effettive. Possiamo facilmente scrivere una configurazione di test e iniettare i nostri bean simulati per scopi di testing.
  • Riduce la quantità di codice di boilerplate, come l’inizializzazione degli oggetti, l’apertura/chiusura delle risorse. Mi piace molto la classe JdbcTemplate perché ci aiuta a rimuovere tutto il codice di boilerplate che viene fornito con la programmazione JDBC.
  • Il framework Spring è diviso in diversi moduli, il che ci aiuta a mantenere leggera la nostra applicazione. Ad esempio, se non abbiamo bisogno delle funzionalità di gestione delle transazioni di Spring, non è necessario aggiungere quella dipendenza al nostro progetto.
  • Il framework Spring supporta la maggior parte delle funzionalità di Java EE e molto altro ancora. È sempre all’avanguardia con le nuove tecnologie; ad esempio, esiste un progetto Spring per Android che ci aiuta a scrivere codice migliore per le applicazioni native di Android. Ciò rende il framework Spring un pacchetto completo, eliminando la necessità di cercare framework diversi per requisiti diversi.

4. Quali sono le caratteristiche importanti di Spring 5?

Spring 5 rappresenta una revisione significativa rispetto a Spring 4. Alcune delle caratteristiche importanti sono:

  • Supporto per Java 8 e versioni successive, consentendo l’uso di espressioni lambda.
  • Supporto per Java EE7 e specifiche Servlet 4.0.
  • Le operazioni su file vengono ora eseguite tramite flussi NIO 2, un notevole miglioramento per le applicazioni che gestiscono molti file.
  • Introduzione di spring-jcl per semplificare il logging, risolvendo il problema della mancanza di un punto unico per scopi di registrazione.
  • Supporto per Kotlin, Lombok, Reactor 3.1 Flux, e Mono, nonché RxJava.
  • Spring WebFlux, che porta la programmazione reattiva a Spring.
  • Supporto per JUnit 5.
  • Supporto per fornire informazioni sui componenti di Spring tramite il file di indice “META-INF/spring.components” anziché la scansione del classpath.

Si prega di consultare le caratteristiche di Spring 5 per una panoramica dettagliata di questa versione.

5. Cos’è Spring WebFlux?

Spring WebFlux è il nuovo modulo introdotto in Spring 5. Spring WebFlux è il primo passo verso il modello di programmazione reattiva nel framework Spring.

Spring WebFlux è l’alternativa al modulo Spring MVC. Spring WebFlux viene utilizzato per creare un’applicazione completamente asincrona e non bloccante basata sul modello di esecuzione ad eventi.

Puoi leggere di più a riguardo nel Tutorial di Spring WebFlux.

6. Cosa si intende per Dependency Injection?

Il design pattern Dependency Injection ci permette di rimuovere le dipendenze codificate in modo rigido e rendere la nostra applicazione scarsamente accoppiata, estendibile e manutenibile. Possiamo implementare il pattern di injection delle dipendenze per spostare la risoluzione delle dipendenze dal momento della compilazione al momento dell’esecuzione.

Alcuni dei vantaggi dell’utilizzo dell’Injection di Dipendenza sono la Separazione delle Preoccupazioni, la riduzione del codice boilerplate, i componenti configurabili e il facile testing delle unità.

Leggi di più su Tutorial sull’Injection di Dipendenza. Possiamo anche utilizzare Google Guice per l’Injection di Dipendenza per automatizzare il processo di injection di dipendenza. Ma nella maggior parte dei casi, cerchiamo più di semplice injection di dipendenza ed è qui che Spring primeggia.

7. Come implementiamo l’Injection di Dipendenza nel framework Spring?

Possiamo utilizzare la configurazione basata su XML o basata su annotazioni di Spring per implementare l’Injection di Dipendenza nelle applicazioni Spring. Per una migliore comprensione, leggi l’esempio di Injection di Dipendenza di Spring in cui puoi imparare entrambi i modi con un caso di test JUnit. L’articolo contiene anche un file zip di un progetto di esempio, che puoi scaricare e sperimentare per imparare di più.

8. Quali sono i vantaggi nell’uso di Spring Tool Suite?

Possiamo installare plugin in Eclipse per ottenere tutte le funzionalità di Spring Tool Suite. Tuttavia, STS viene fornito con Eclipse con altre importanti funzionalità come il supporto Maven, modelli per la creazione di diversi tipi di progetti Spring e tc server per una migliore performance con le applicazioni Spring.

I like STS because it highlights the Spring components and if you are using AOP pointcuts and advice, then it clearly shows which methods will come under the specific pointcut. So rather than installing everything on our own, I prefer using STS when developing Spring-based applications.

9. Nomina alcuni dei moduli Spring importanti?

Alcuni dei moduli importanti di Spring Framework sono:

  • Spring Context – per l’iniezione di dipendenze.
  • Spring AOP – per la programmazione orientata agli aspetti.
  • Spring DAO – per le operazioni sul database utilizzando il pattern DAO
  • Spring JDBC – per il supporto JDBC e DataSource.
  • Spring ORM – per il supporto agli strumenti ORM come Hibernate
  • Spring Web Module – per la creazione di applicazioni web.
  • Spring MVC – Implementazione del Model-View-Controller per la creazione di applicazioni web, servizi web, ecc.

10. Cosa intendi per Programmazione Orientata agli Aspetti?

Le applicazioni enterprise presentano delle preoccupazioni trasversali comuni che sono applicabili a diversi tipi di oggetti e moduli dell’applicazione, come il logging, la gestione delle transazioni, la validazione dei dati, l’autenticazione, ecc. La modularità dell’applicazione è ottenuta dalle classi nella programmazione orientata agli oggetti. Nell’AOP, la modularità dell’applicazione è ottenuta dagli Aspetti e vengono configurati per attraversare diversi metodi delle classi.

L’AOP rimuove la dipendenza diretta delle attività trasversali dalle classi che non è possibile nella normale programmazione orientata agli oggetti. Ad esempio, possiamo avere una classe separata per il logging, ma le altre classi dovranno chiamare questi metodi. Ma, nell’AOP configuriamo gli aspetti e l’esecuzione del metodo avviene automaticamente. Leggi di più sul supporto di Spring AOP su Esempio di Spring AOP.

11. Cosa sono Aspect, Advice, Pointcut, JointPoint e gli Argomenti dell’Advice in AOP?

Aspetto: L’aspetto è una classe che implementa le preoccupazioni trasversali, come la gestione delle transazioni. Gli aspetti possono essere una classe normale configurata e successivamente configurata nel file di configurazione del bean Spring o possiamo utilizzare il supporto Spring AspectJ per dichiarare una classe come un aspetto utilizzando l’annotazione @Aspect.

Consiglio: Il consiglio è l’azione intrapresa per un particolare punto di unione. In termini di programmazione, sono metodi che vengono eseguiti quando un punto di unione specifico con un pointcut corrispondente viene raggiunto nell’applicazione. Puoi pensare al Consiglio come agli intercettori Spring o ai filtri Servlet.

Pointcut: I pointcut sono espressioni regolari che corrispondono ai punti di unione per determinare se è necessario eseguire o meno il consiglio. Il pointcut utilizza diversi tipi di espressioni che corrispondono ai punti di unione. Il framework Spring utilizza il linguaggio delle espressioni del pointcut di AspectJ per determinare i punti di unione in cui verranno applicati i metodi di consiglio.

JoinPoint: Un join point è un punto specifico nell’applicazione come l’esecuzione di un metodo, la gestione delle eccezioni, la modifica dei valori delle variabili dell’oggetto, ecc. In AOP di Spring, un join point è sempre l’esecuzione di un metodo.

Argomenti di Consiglio: Possiamo passare argomenti nei metodi di consiglio. Possiamo utilizzare l’espressione args() nel pointcut da applicare a qualsiasi metodo che corrisponda al modello di argomento. Se utilizziamo questo, allora dobbiamo utilizzare lo stesso nome nel metodo di consiglio da dove viene determinato il tipo di argomento.

Questi concetti sembrano confusi all’inizio, ma se vai attraverso Spring Aspect, Esempio di Consiglio allora puoi facilmente collegarti a loro.

12. Qual è la differenza tra Spring AOP e AspectJ AOP?

AspectJ è l’implementazione standard del settore per la programmazione orientata agli aspetti, mentre Spring implementa l’AOP per alcuni casi. Le principali differenze tra Spring AOP e AspectJ sono:

  • Spring AOP è più semplice da usare rispetto ad AspectJ perché non dobbiamo preoccuparci del processo di tessitura.
  • Spring AOP supporta le annotazioni AspectJ, quindi se sei familiare con AspectJ, lavorare con Spring AOP è più facile.
  • Spring AOP supporta solo l’AOP basato su proxy, quindi può essere applicato solo ai punti di giunzione dell’esecuzione del metodo. AspectJ supporta tutti i tipi di pointcut.
  • Uno dei limiti di Spring AOP è che può essere applicato solo ai bean creati attraverso il contesto Spring.

13. Cosa è il contenitore IoC di Spring?

L’Inversione di Controllo (IoC) è il meccanismo per ottenere un accoppiamento ridotto tra le dipendenze degli oggetti. Per realizzare un accoppiamento ridotto e il binding dinamico degli oggetti a runtime, gli oggetti definiscono le loro dipendenze che vengono iniettate da altri oggetti assembler. Il contenitore IoC di Spring è il programma che inietta le dipendenze in un oggetto e lo rende pronto per il nostro utilizzo.

Le classi del contenitore IoC del framework Spring fanno parte dei pacchetti org.springframework.beans e org.springframework.context e ci forniscono diversi modi per scollegare le dipendenze degli oggetti.

Alcune delle utili implementazioni di ApplicationContext che utilizziamo sono;

  • AnnotationConfigApplicationContext: Per applicazioni Java standalone che utilizzano una configurazione basata su annotazioni.
  • ClassPathXmlApplicationContext: Per applicazioni Java standalone che utilizzano una configurazione basata su XML.
  • FileSystemXmlApplicationContext: Simile a ClassPathXmlApplicationContext, tranne che il file di configurazione XML può essere caricato da qualsiasi posizione nel sistema di file.
  • AnnotationConfigWebApplicationContext e XmlWebApplicationContext per le applicazioni web.

14. Cos’è un Spring Bean?

Qualsiasi classe Java normale inizializzata dal contenitore IoC di Spring è chiamata Spring Bean. Utilizziamo ApplicationContext di Spring per ottenere l’istanza del Spring Bean.

Il contenitore IoC di Spring gestisce il ciclo di vita del Spring Bean, gli ambiti dei bean e l’iniezione delle dipendenze necessarie nel bean.

15. Qual è l’importanza del file di configurazione dei bean di Spring?

Utilizziamo il file di configurazione dei bean di Spring per definire tutti i bean che verranno inizializzati dal contesto di Spring. Quando creiamo l’istanza di ApplicationContext di Spring, legge il file XML dei bean di Spring e li inizializza tutti. Una volta che il contesto è inizializzato, possiamo usarlo per ottenere diverse istanze di bean.

Oltre alla configurazione dei bean di Spring, questo file contiene anche intercettori MVC di Spring, risolutori di visualizzazione e altri elementi per supportare configurazioni basate su annotazioni.

16. Quali sono i diversi modi per configurare una classe come Spring Bean?

Esistono tre modi diversi per configurare un Spring Bean.

Configurazione XML: Questa è la configurazione più popolare e possiamo utilizzare l’elemento bean nel file di contesto per configurare un Spring Bean. Ad esempio:

<bean name="myBean" class="com.journaldev.spring.beans.MyBean"></bean>

Configurazione basata su Java: Se si utilizzano solo le annotazioni, è possibile configurare un bean Spring utilizzando l’annotazione @Bean. Questa annotazione viene utilizzata con le classi @Configuration per configurare un bean Spring. Configurazione di esempio:

@Configuration
@ComponentScan(value="com.journaldev.spring.main")
public class MyConfiguration {

	@Bean
	public MyService getService(){
		return new MyService();
	}
}

Per ottenere questo bean dal contesto Spring, è necessario utilizzare il seguente snippet di codice:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
		MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);

Configurazione basata su annotazioni: Possiamo anche utilizzare le annotazioni @Component, @Service, @Repository e @Controller con le classi per configurarle come bean Spring. Per questi, dovremmo fornire la posizione del pacchetto base per eseguire la scansione di queste classi. Ad esempio:

<context:component-scan base-package="com.journaldev.spring" />

17. Quali sono i diversi ambiti di Spring Bean?

Esistono cinque ambiti definiti per i Spring Bean.

  1. singleton: Verrà creato un solo istanza del bean per ogni contenitore. Questo è l’ambito predefinito per i spring bean. Quando si utilizza questo ambito, assicurarsi che il bean di Spring non abbia variabili di istanza condivise, altrimenti potrebbe causare problemi di inconsistenza dei dati perché non è thread-safe.
  2. prototype: Verrà creata una nuova istanza ogni volta che viene richiesto il bean.
  3. request: Questo è lo stesso ambito del prototype, tuttavia, è destinato ad essere utilizzato per le applicazioni web. Verrà creata una nuova istanza del bean per ogni richiesta HTTP.
  4. session: Verrà creato un nuovo bean per ogni sessione HTTP dal contenitore.
  5. global-session: Questo viene utilizzato per creare bean di sessione globale per le applicazioni Portlet.

Il framework Spring è estensibile e possiamo creare anche i nostri ambiti personalizzati. Ma nella maggior parte dei casi ci possiamo accontentare degli ambiti forniti dal framework. Per impostare gli ambiti dei bean di Spring possiamo utilizzare l’attributo “scope” nell’elemento bean o l’annotazione @Scope per le configurazioni basate su annotazioni.

18. Qual è il ciclo di vita di un Spring Bean?

I bean di Spring vengono inizializzati dal contenitore di Spring e vengono iniettate anche tutte le dipendenze. Quando il contesto viene distrutto, vengono distrutti anche tutti i bean inizializzati. Questo funziona bene nella maggior parte dei casi, ma a volte vogliamo inizializzare altre risorse o fare delle validazioni prima di rendere i nostri bean pronti all’uso. Il framework di Spring fornisce supporto per i metodi di post-inizializzazione e pre-distruzione nei bean di Spring.

Possiamo fare questo in due modi: implementando le interfacce InitializingBean e DisposableBean o utilizzando gli attributi init-method e destroy-method nelle configurazioni dei bean di Spring. Per ulteriori dettagli, leggere Metodi del ciclo di vita dei bean di Spring.

19. Come ottenere l’oggetto ServletContext e ServletConfig in un bean di Spring?

Ci sono due modi per ottenere gli oggetti specifici del contenitore nel bean di Spring.

  • Implementando le interfacce *Aware di Spring, per queste interfacce ServletContextAware e ServletConfigAware, per un esempio completo di queste interfacce aware, leggi Spring Aware Interfaces.
  • Utilizzando l’annotazione @Autowired con una variabile bean di tipo ServletContext e ServletConfig. Funzioneranno solo in ambienti specifici del contenitore servlet.
@Autowired
ServletContext servletContext;

20. Cos’è il cablaggio del bean e @Autowired annotazione?

Il processo di iniezione delle dipendenze del bean di Spring durante l’inizializzazione è chiamato Spring Bean Wiring.

Di solito, è buona pratica fare il cablaggio esplicito di tutte le dipendenze del bean, ma il framework Spring supporta anche l’autowiring. Possiamo utilizzare l’annotazione @Autowired con campi o metodi per il autowiring byType. Per far funzionare questa annotazione, è necessario abilitare la configurazione basata su annotazioni nel file di configurazione del bean Spring. Ciò può essere fatto con l’elemento context:annotation-config.

Per ulteriori dettagli sull’annotazione @Autowired, leggi Spring Autowire Example.

21. Quali sono i diversi tipi di autowiring di Spring Bean?

Esistono quattro tipi di autowiring nel framework Spring.

  1. autowire byName
  2. autowire byType
  3. autowire by constructor
  4. autowiring tramite @Autowired e annotazioni @Qualifier

Prima di Spring 3.1, autowire by autodetect era supportato, simile all’autowire by constructor o byType. Per ulteriori dettagli su queste opzioni, si prega di leggere Spring Bean Autowiring.

22. Spring Bean fornisce la sicurezza del thread?

Lo scope predefinito del bean Spring è singleton, quindi ci sarà solo un’istanza per contesto. Ciò significa che tutte le variabili di livello di classe che possono essere aggiornate da qualsiasi thread porteranno a dati non consistenti. Pertanto, nella modalità predefinita i bean Spring non sono thread-safe.

Tuttavia, possiamo cambiare lo scope del bean di primavera in richiesta, prototipo o sessione per ottenere la sicurezza del thread a discapito delle prestazioni. È una decisione di design e basata sui requisiti del progetto.

23. Cos’è un Controller in Spring MVC?

Come il pattern di progettazione MVC, il Controller è la classe che si occupa di tutte le richieste dei client e le invia alle risorse configurate per gestirle. In Spring MVC, DispatcherServlet è la classe del controller frontale che inizializza il contesto in base alle configurazioni dei bean di primavera.

A Controller class is responsible to handle a different kind of client requests based on the request mappings. We can create a controller class by using @Controller annotation. Usually, it’s used with @RequestMapping annotation to define handler methods for specific URI mapping.

24. Qual è la differenza tra @Component, @Controller, @Repository & @Service annotazioni in Spring?

@Component viene utilizzato per indicare che una classe è un componente. Queste classi vengono utilizzate per la rilevazione automatica e configurate come bean quando vengono utilizzate configurazioni basate su annotazioni.

@Controller è un tipo specifico di componente, utilizzato nelle applicazioni MVC e principalmente utilizzato con l’annotazione RequestMapping.

@Repository viene utilizzata per indicare che un componente viene utilizzato come repository e come meccanismo per memorizzare/recuperare/ricercare dati. Possiamo applicare questa annotazione con classi di implementazione del pattern DAO.

@Service viene utilizzato per indicare che una classe è un servizio. Di solito, le classi facade aziendali che forniscono alcuni servizi sono annotate con questa annotazione.

Possiamo utilizzare una qualsiasi delle annotazioni sopra elencate per una classe per la rilevazione automatica, ma vengono forniti tipi diversi in modo che tu possa distinguere facilmente lo scopo delle classi annotate.

25. Cos’è DispatcherServlet e ContextLoaderListener?

DispatcherServlet è il controller frontale nell’applicazione Spring MVC e carica il file di configurazione dei bean di Spring inizializzando tutti i bean configurati. Se le annotazioni sono abilitate, esegue anche la scansione dei pacchetti e configura qualsiasi bean annotato con le annotazioni @Component, @Controller, @Repository o @Service.

ContextLoaderListener è il listener per avviare e spegnere il WebApplicationContext radice di Spring. Le sue funzioni principali sono legare il ciclo di vita di ApplicationContext al ciclo di vita di ServletContext e automatizzare la creazione di ApplicationContext. Possiamo usarlo per definire bean condivisi che possono essere utilizzati in diversi contesti Spring.

26. Cos’è ViewResolver in Spring?

Le implementazioni di ViewResolver vengono utilizzate per risolvere le pagine di visualizzazione per nome. Lo configuriamo nel file di configurazione dei bean di Spring. Ad esempio:

<!-- Risolve le viste selezionate per il rendering da @Controllers alle risorse .jsp nella directory /WEB-INF/views -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<beans:property name="prefix" value="/WEB-INF/views/" />
	<beans:property name="suffix" value=".jsp" />
</beans:bean>

InternalResourceViewResolver è una delle implementazioni dell’interfaccia ViewResolver e stiamo fornendo la directory delle pagine di visualizzazione e la posizione del suffisso attraverso le proprietà del bean. Quindi, se un metodo del gestore del controller restituisce “home”, il risolutore della visualizzazione utilizzerà la pagina di visualizzazione situata in /WEB-INF/views/home.jsp.

27. Cos’è un MultipartResolver e quando viene utilizzato?

L’interfaccia MultipartResolver viene utilizzata per caricare file: CommonsMultipartResolver e StandardServletMultipartResolver sono due implementazioni fornite dal framework Spring per l’upload di file. Per impostazione predefinita, non ci sono risolutori multipart configurati, ma per usarli per l’upload di file, è sufficiente definire un bean chiamato “multipartResolver” con tipo MultipartResolver nelle configurazioni dei bean di Spring.

Una volta configurato, ogni richiesta multipart verrà risolta dal MultipartResolver configurato e passerà a un HttpServletRequest incapsulato. Viene quindi utilizzato nella classe del controller per ottenere il file e elaborarlo. Per un esempio completo, leggere Spring MVC File Upload Example.

28. Come gestire le eccezioni nel framework Spring MVC?

Il framework Spring MVC fornisce i seguenti modi per aiutarci a gestire in modo robusto le eccezioni.

Basato sul controller – Possiamo definire metodi gestori delle eccezioni nelle nostre classi controller. Tutto ciò di cui abbiamo bisogno è annotare questi metodi con l’annotazione @ExceptionHandler.

Gestore globale delle eccezioni – La gestione delle eccezioni è una preoccupazione trasversale e Spring fornisce l’annotazione @ControllerAdvice che possiamo utilizzare con qualsiasi classe per definire il nostro gestore globale delle eccezioni.

Implementazione di HandlerExceptionResolver – Per le eccezioni generiche, nella maggior parte dei casi serviamo pagine statiche. Il framework Spring fornisce un’interfaccia HandlerExceptionResolver che possiamo implementare per creare un gestore globale delle eccezioni. Il motivo di questo modo aggiuntivo per definire il gestore globale delle eccezioni è che il framework Spring fornisce anche classi di implementazione predefinite che possiamo definire nel nostro file di configurazione del bean Spring per ottenere i benefici della gestione delle eccezioni del framework Spring.

Per un esempio completo, si prega di leggere Spring Exception Handling Example.

29. Come creare ApplicationContext in un programma Java?

Esistono diversi modi per creare un contesto spring in un programma Java autonomo.

  1. AnnotationConfigApplicationContext: Se stiamo utilizzando Spring in applicazioni Java autonome e utilizziamo annotazioni per la configurazione, allora possiamo utilizzare questo per inizializzare il contenitore e ottenere gli oggetti bean.
  2. ClassPathXmlApplicationContext: Se abbiamo un file di configurazione del bean spring XML in un’applicazione autonoma, allora possiamo utilizzare questa classe per caricare il file e ottenere l’oggetto del contenitore.
  3. FileSystemXmlApplicationContext: Questo è simile a ClassPathXmlApplicationContext tranne che il file di configurazione XML può essere caricato da qualsiasi parte del file system.

30. Possiamo avere più file di configurazione Spring?

Per le applicazioni Spring MVC, possiamo definire più file di configurazione del contesto Spring tramite contextConfigLocation. Questa stringa di posizione può consistere in più posizioni separate da qualsiasi numero di virgole e spazi. Ad esempio;

<servlet>
	<servlet-name>appServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
            <param-name>contextConfigLocation</param-name>
	    <param-value>/WEB-INF/spring/appServlet/servlet-context.xml,/WEB-INF/spring/appServlet/servlet-jdbc.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

Possiamo anche definire più configurazioni di livello radice di Spring e caricarle tramite context-param. Ad esempio;

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml /WEB-INF/spring/root-security.xml</param-value>
</context-param>

Un’altra opzione è utilizzare l’elemento di importazione nel file di configurazione del contesto per importare altre configurazioni, ad esempio:

<beans:import resource="spring-jdbc.xml"/>

31. Cosa è ContextLoaderListener?

ContextLoaderListener è la classe listener utilizzata per caricare il contesto radice e definire le configurazioni dei bean Spring che saranno visibili a tutti gli altri contesti. Viene configurato nel file web.xml come:

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
	
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

32. Quali sono le configurazioni minime necessarie per creare un’applicazione Spring MVC?

Per creare un’applicazione Spring MVC semplice, dovremmo eseguire i seguenti compiti.

  • Aggiungi le dipendenze spring-context e spring-webmvc nel progetto.
  • Configurare DispatcherServlet nel file web.xml per gestire le richieste attraverso il contenitore Spring.
  • File di configurazione del bean Spring per definire i bean, se si utilizzano le annotazioni, è necessario configurarle qui. Inoltre, è necessario configurare il resolver della vista per le pagine della vista.
  • Classe del controller con mapping delle richieste definite per gestire le richieste del client.

Questi passaggi dovrebbero essere sufficienti per creare un’applicazione Spring MVC Hello World semplice.

33. Come relazioneresti il framework Spring MVC all’architettura MVC?

Come suggerisce il nome, Spring MVC è costruito sopra l’architettura Model-View-Controller. DispatcherServlet è il controller principale nell’applicazione Spring MVC che gestisce tutte le richieste in arrivo e le delega ai diversi metodi del gestore del controller.

Il modello può essere qualsiasi Java Bean nel framework Spring, proprio come in qualsiasi altro framework MVC, Spring fornisce il binding automatico dei dati del modulo ai Java Bean. Possiamo impostare i bean del modello come attributi da utilizzare nelle pagine della vista.

Le pagine della vista possono essere JSP, HTML statico, ecc. e i resolver della vista sono responsabili per trovare la pagina della vista corretta. Una volta identificata la pagina della vista, il controllo viene restituito al controller DispatcherServlet. DispatcherServlet è responsabile per il rendering della vista e per restituire la risposta finale al client.

34. Come ottenere la localizzazione nelle applicazioni Spring MVC?

Spring fornisce un eccellente supporto per la localizzazione o i18n attraverso i bundle di risorse. I passaggi di base necessari per rendere la nostra applicazione localizzata sono:

  • Creare bundle di risorse di messaggi per diverse localizzazioni, come ad esempio messages_en.properties, messages_fr.properties, ecc.
  • Definire il bean messageSource nel file di configurazione dei bean di Spring di tipo ResourceBundleMessageSource o ReloadableResourceBundleMessageSource.
  • Per il supporto al cambio di localizzazione, definire il bean localeResolver di tipo CookieLocaleResolver e configurare l’interceptor LocaleChangeInterceptor. Un esempio di configurazione è mostrato come segue:
<beans:bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:messages" />
<beans:property name="defaultEncoding" value="UTF-8" />
</beans:bean>
 
<beans:bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <beans:property name="defaultLocale" value="en" />
    <beans:property name="cookieName" value="myAppLocaleCookie"></beans:property>
    <beans:property name="cookieMaxAge" value="3600"></beans:property>
</beans:bean>
 
<interceptors>
    <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <beans:property name="paramName" value="locale" />
    </beans:bean>
</interceptors>
  • Utilizzare l’elemento spring:message nelle pagine di visualizzazione con nomi chiave, DispatcherServlet seleziona il valore corrispondente e renderizza la pagina nella localizzazione corrispondente e restituisce come risposta.

Per un esempio completo, leggere Spring Localization Example.

35. Come possiamo utilizzare Spring per creare un servizio Web Restful che restituisca una risposta JSON?

Possiamo utilizzare il framework Spring per creare servizi web Restful che restituiscano dati JSON. Spring offre un’integrazione con l’API JSON di Jackson che possiamo utilizzare per inviare risposte JSON in un servizio web Restful.

Dovremmo seguire i seguenti passaggi per configurare la nostra applicazione Spring MVC in modo da inviare una risposta JSON.

1. Aggiungere le dipendenze JSON di Jackson, se si utilizza Maven è possibile farlo con il codice seguente:

<!-- Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.databind-version}</version>
</dependency>

2. Configurare il bean RequestMappingHandlerAdapter nel file di configurazione dei bean Spring e impostare la proprietà message converters su MappingJackson2HttpMessageConverter bean. Una configurazione di esempio sarà:

<!-- Configurare per inserire JSON come richiesta e risposta nell'handler del metodo -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <beans:property name="messageConverters">
        <beans:list>
            <beans:ref bean="jsonMessageConverter"/>
        </beans:list>
    </beans:property>
</beans:bean>
     
<!-- Configurare il bean per convertire JSON in POJO e viceversa -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>

3. Nei metodi handler del controller, restituire l’oggetto come risposta utilizzando l’annotazione @ResponseBody. Codice di esempio:

@RequestMapping(value = EmpRestURIConstants.GET_EMP, method = RequestMethod.GET)
public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) {
    logger.info("Start getEmployee. ID="+empId);
     
    return empData.get(empId);
}

4. È possibile chiamare il servizio Rest tramite qualsiasi API, ma se si desidera utilizzare Spring, è possibile farlo facilmente utilizzando la classe RestTemplate.

Per un esempio completo, si prega di leggere l’Esempio di Spring Restful Webservice.

36. Quali sono alcune delle importanti annotazioni di Spring che hai utilizzato?

Alcune delle annotazioni di Spring che ho utilizzato nel mio progetto sono:

37. Possiamo inviare un oggetto come risposta del metodo gestore del controller?

Sì, possiamo farlo utilizzando l’annotazione @ResponseBody. Ecco come inviamo una risposta basata su JSON o XML nei servizi web RESTful.

38. Come caricare file nell’applicazione Spring MVC?

Spring fornisce supporto integrato per il caricamento di file attraverso le implementazioni dell’interfaccia MultipartResolver. È molto facile da usare e richiede solo modifiche di configurazione per farlo funzionare. Dovremmo scrivere un metodo del gestore del controller per gestire il file in arrivo e elaborarlo. Per un esempio completo, fare riferimento a Spring File Upload Example.

39. Come validare i dati del modulo nel framework Spring Web MVC?

Spring supporta le validazioni basate su annotazioni JSR-303 e fornisce un’interfaccia Validator che possiamo implementare per creare il nostro validatore personalizzato. Per utilizzare la validazione basata su JSR-303, dobbiamo annotare le variabili del bean con le validazioni richieste.

Per l’implementazione del validatore personalizzato, è necessario configurarlo nella classe del controller. Per un esempio completo, leggi Spring MVC Form Validation Example.

40. Cos’è l’interceptor di Spring MVC e come si utilizza?

Gli intercettori di Spring MVC sono simili ai filtri Servlet e ci consentono di intercettare le richieste dei client e elaborarle. Possiamo intercettare le richieste dei client in tre punti: preHandle, postHandle e afterCompletion.

Possiamo creare un interceptor Spring implementando l’interfaccia HandlerInterceptor o estendendo la classe astratta HandlerInterceptorAdapter.

Abbiamo bisogno di configurare gli intercettori nel file di configurazione del fagiolo Spring. Possiamo definire un interceptor per intercettare tutte le richieste del client o possiamo configurarlo anche per il mapping URI specifico. Per un esempio dettagliato, fare riferimento a Spring MVC Interceptor Example.

41. Cos’è la classe Spring JdbcTemplate e come si utilizza?

Il framework Spring fornisce un’eccellente integrazione con l’API JDBC e fornisce la classe di utilità JdbcTemplate che possiamo utilizzare per evitare codice ridondante dalla nostra logica operativa del database come Apertura/Chiusura Connessione, ResultSet, PreparedStatement ecc.

Per un esempio di JdbcTemplate, fare riferimento a Spring JDBC Example.

42. Come utilizzare Tomcat JNDI DataSource in un’applicazione Web Spring?

Per utilizzare un servlet container configurato con JNDI DataSource, è necessario configurarlo nel file di configurazione dei bean di Spring e quindi iniettarlo nei bean di Spring come dipendenze. Quindi possiamo utilizzarlo con `JdbcTemplate` per eseguire operazioni sul database.

<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>

Per un esempio completo, fare riferimento a Esempio di Tomcat JNDI Spring.

43. Come si gestisce la gestione delle transazioni in Spring?

Il framework Spring fornisce supporto alla gestione delle transazioni attraverso la Gestione delle Transazioni Dichiarativa così come la gestione delle transazioni programmatiche. La gestione delle transazioni dichiarativa è la più utilizzata perché è facile da usare e funziona nella maggior parte dei casi.

Utilizziamo l’annotazione `@Transactional` per la gestione delle transazioni dichiarativa. È necessario configurare il gestore delle transazioni per il DataSource nel file di configurazione dei bean di Spring.

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

44. Cos’è Spring DAO?

Spring DAO support è fornito per lavorare con tecnologie di accesso ai dati come JDBC, Hibernate in modo coerente e facile. Ad esempio, abbiamo JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport e JpaDaoSupport per le rispettive tecnologie.

Spring DAO fornisce anche coerenza nella gerarchia delle eccezioni e non è necessario gestire eccezioni specifiche.

45. Come integrare i framework Spring e Hibernate?

Possiamo utilizzare il modulo Spring ORM per integrare i framework Spring e Hibernate se si sta utilizzando Hibernate 3+ dove SessionFactory fornisce la sessione corrente, è quindi consigliabile evitare l’uso delle classi HibernateTemplate o HibernateDaoSupport e utilizzare meglio il pattern DAO con l’iniezione di dipendenze per l’integrazione.

Spring ORM fornisce il supporto per l’uso della gestione transazionale dichiarativa di Spring, quindi è consigliabile utilizzarla piuttosto che optare per il codice boilerplate di Hibernate per la gestione delle transazioni.

Per una migliore comprensione, si consiglia di consultare i seguenti tutorial:

46. Cos’è Spring Security?

Il framework di sicurezza Spring si concentra sulla fornitura di autenticazione e autorizzazione nelle applicazioni Java. Si occupa anche della maggior parte delle comuni vulnerabilità di sicurezza, come gli attacchi CSRF.

È molto vantaggioso e facile utilizzare la sicurezza Spring nelle applicazioni web, attraverso l’uso di annotazioni come @EnableWebSecurity. Dovresti consultare i seguenti articoli per imparare come utilizzare il framework Spring Security.

47. Come iniettare una java.util.Properties in un bean Spring?

Dobbiamo definire il bean propertyConfigurer che caricherà le proprietà dal file di proprietà fornito. Quindi possiamo utilizzare il supporto di Spring EL per iniettare le proprietà nelle dipendenze di altri bean. Ad esempio:

<bean id="propertyConfigurer" 
  class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="location" value="/WEB-INF/application.properties" />
</bean> 

<bean class="com.journaldev.spring.EmployeeDaoImpl">
    <property name="maxReadResults" value="${results.read.max}"/>
</bean>

Se stai utilizzando l’annotazione per configurare il bean di Spring, allora puoi iniettare la proprietà come segue.

@Value("${maxReadResults}") 
private int maxReadResults;

48. Nomi alcuni dei design pattern utilizzati nel framework Spring?

Il framework Spring utilizza molti design pattern, alcuni dei più comuni sono:

  1. Singleton Pattern: Creazione di bean con ambito predefinito.
  2. Factory Pattern: Classi di fabbrica di bean
  3. Prototype Pattern: Ambiti di bean
  4. Adapter Pattern: Spring Web e Spring MVC
  5. Proxy Pattern: Supporto alla programmazione orientata agli aspetti di Spring
  6. Template Method Pattern: JdbcTemplate, HibernateTemplate, ecc
  7. Front Controller: Spring MVC DispatcherServlet
  8. Data Access Object: supporto DAO di Spring
  9. Iniezione di dipendenza e programmazione orientata agli aspetti

49. Quali sono le migliori pratiche per il framework Spring?

Alcune delle migliori pratiche per il framework Spring sono:

  • Evitare i numeri di versione nel riferimento dello schema, per assicurarsi di avere le configurazioni più recenti.
  • Dividere le configurazioni dei bean Spring in base alle loro preoccupazioni, ad esempio spring-jdbc.xml, spring-security.xml.
  • Per i bean Spring utilizzati in più contesti in Spring MVC, crearli nel contesto radice e inizializzarli con il listener.
  • Configurare le dipendenze dei bean il più possibile, cercare di evitare l’autowiring il più possibile.
  • Per le proprietà a livello di applicazione, l’approccio migliore è creare un file di proprietà e leggerlo nel file di configurazione dei bean Spring.
  • Per le applicazioni più piccole, le annotazioni sono utili ma per le applicazioni più grandi, le annotazioni possono diventare un problema. Se abbiamo tutta la configurazione nei file XML, sarà più facile mantenerla.
  • Usa le annotazioni corrette per i componenti per comprendere facilmente lo scopo. Per i servizi utilizza @Service e per i bean DAO utilizza @Repository.
  • Il framework Spring ha molti moduli, utilizza ciò di cui hai bisogno. Rimuovi tutte le dipendenze extra che vengono di solito aggiunte quando si creano progetti tramite i modelli di Spring Tool Suite.
  • Se stai utilizzando gli Aspects, assicurati di mantenere il join point il più ristretto possibile per evitare consigli su metodi non desiderati. Considera annotazioni personalizzate più facili da usare per evitare problemi.
  • Utilizza l’iniezione delle dipendenze solo se c’è un effettivo beneficio, non usarla solo per il principio di basso accoppiamento, fallo solo se è più difficile da mantenere.

50. Cos’è Spring Boot?

Spring Boot rende unico il framework Spring. Ci offre un modo facile per creare diversi tipi di applicazioni Java e collegarle all’ambiente di runtime del contenitore servlet. Otteniamo così un singolo file JAR che possiamo eseguire per avviare il progetto. Questo ci risparmia molto tempo nel ottenere rapidamente il progetto scheletro pronto per il deployment del prodotto. In questo modo possiamo concentrarci di più sulla logica di business anziché seguire il processo comune di compilazione del codice e successivo deployment su un contenitore servlet. Poiché si tratta di un argomento molto vasto, ti consiglierei di consultare Spring Boot Interview Questions.

Questo è tutto per le domande di intervista sul framework Spring. Spero che queste domande ti aiutino nel prossimo colloquio su Java EE. Continuerò ad aggiungere ulteriori domande alla lista non appena le troverò. Se conosci altre domande che dovrebbero far parte della lista, assicurati di aggiungere un commento e le includerò.

Source:
https://www.digitalocean.com/community/tutorials/spring-interview-questions-and-answers