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.
El Framework Spring es uno de los frameworks Java EE más populares para aplicaciones web. La Inyección de Dependencias y la Programación Orientada a Aspectos están en el corazón del framework Spring. Si eres bueno en el Framework Spring, las posibilidades de ser seleccionado aumentan mucho en las entrevistas de Java.
Consejo Profesional: Java Core es la base de cualquier framework basado en Java, así que si te estás preparando para entrevistas, por favor revisa los artículos de Preguntas de Entrevista sobre Java Core y Preguntas de Entrevista de Java.
Preguntas y Respuestas de Entrevista de Spring
Aquí estoy proporcionando casi 50 preguntas de entrevista de Spring y sus respuestas. Está actualizado hasta Spring 5, por lo que cubre todas las características más recientes como Spring WebFlux para programación reactiva.
1. ¿Qué es el Framework Spring?
Spring es uno de los frameworks Java EE más ampliamente utilizados. Los conceptos principales del framework Spring son “Inyección de Dependencias” y “Programación Orientada a Aspectos”.
El framework Spring también puede ser utilizado en aplicaciones Java normales para lograr un acoplamiento débil entre diferentes componentes mediante la implementación de inyección de dependencias. Podemos realizar tareas transversales como el registro y la autenticación utilizando el soporte de Spring para la programación orientada a aspectos.
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.
Lectura recomendada: Framework Spring
2. ¿Cuáles son algunas de las características importantes del Framework Spring?
El Framework Spring se basa en dos conceptos de diseño: Inyección de Dependencias y Programación Orientada a Aspectos.
Algunas de las características del framework Spring son:
- Ligero y con muy poco sobrecosto en el desarrollo al utilizar un framework.
- Inyección de Dependencias o Inversión de Control para escribir componentes que son independientes entre sí, el contenedor de Spring se encarga de conectarlos para lograr nuestro trabajo.
- El contenedor Spring IoC gestiona el ciclo de vida de los Spring Beans y las configuraciones específicas del proyecto, como la búsqueda de JNDI.
- El marco Spring MVC se puede utilizar para crear aplicaciones web y servicios web REST capaces de devolver respuestas tanto en XML como en JSON.
- Soporte para la gestión de transacciones, operaciones JDBC, carga de archivos, manejo de excepciones, etc., con muy pocas configuraciones, ya sea mediante el uso de anotaciones o mediante el archivo de configuración de Spring Bean.
3. ¿Cuál es la ventaja de usar el marco Spring?
Algunas de las ventajas de usar el marco Spring son:
- Reducción de dependencias directas entre diferentes componentes de la aplicación. El contenedor Spring IoC es responsable de inicializar recursos o beans e inyectarlos como dependencias.
- La escritura de casos de prueba unitarios es fácil en el marco Spring porque nuestra lógica de negocio no tiene dependencias directas con las clases de implementación de recursos reales. Podemos escribir fácilmente una configuración de prueba e inyectar nuestros beans simulados con fines de prueba.
- Reduce la cantidad de código repetitivo, como la inicialización de objetos, abrir/cerrar recursos. Me gusta mucho la clase JdbcTemplate porque nos ayuda a eliminar todo el código repetitivo que viene con la programación JDBC.
- El framework Spring se divide en varios módulos, lo que nos ayuda a mantener nuestra aplicación liviana. Por ejemplo, si no necesitamos las funciones de gestión de transacciones de Spring, no es necesario agregar esa dependencia a nuestro proyecto.
- El framework Spring admite la mayoría de las características de Java EE e incluso muchas más. Siempre está a la vanguardia de las nuevas tecnologías, por ejemplo, existe un proyecto de Spring para Android que nos ayuda a escribir un mejor código para aplicaciones nativas de Android. Esto hace que el framework Spring sea un paquete completo y no necesitemos buscar diferentes frameworks para diferentes requisitos.
4. ¿Cuáles son las características importantes de Spring 5?
Spring 5 es una revisión importante de Spring 4. Algunas de las características importantes son:
- Soporte para Java 8 y versiones superiores, lo que nos permite utilizar expresiones lambda.
- Soporte para las especificaciones de Java EE7 y Servlet 4.0.
- Las operaciones de archivos ahora se realizan a través de flujos NIO 2, lo cual es una gran mejora si nuestra aplicación maneja muchos archivos.
- Introducción de spring-jcl para simplificar el registro, anteriormente era un lío debido a la falta de un punto único para fines de registro.
- Soporte para Kotlin, Lombok, Reactor 3.1 Flux y Mono, así como RxJava.
- Spring WebFlux, que permite la programación reactiva en Spring.
- Soporte para JUnit 5.
- Soporte para proporcionar información de los componentes Spring a través del archivo de índice “META-INF/spring.components” en lugar de la exploración de classpath.
Por favor, revise las características de Spring 5 para obtener una descripción detallada de esta versión.
5. ¿Qué es Spring WebFlux?
Spring WebFlux es el nuevo módulo introducido en Spring 5. Spring WebFlux es el primer paso hacia el modelo de programación reactiva en el framework de Spring.
Spring WebFlux es la alternativa al módulo Spring MVC. Spring WebFlux se utiliza para crear una aplicación completamente asíncrona y sin bloqueo construida sobre el modelo de ejecución de eventos en bucle.
Puedes obtener más información al respecto en Tutorial de Spring WebFlux.
6. ¿Qué entendemos por Inyección de Dependencias?
El patrón de diseño de Inyección de Dependencias nos permite eliminar las dependencias codificadas en duro y hacer que nuestra aplicación esté débilmente acoplada, extensible y mantenible. Podemos implementar el patrón de inyección de dependencias para mover la resolución de dependencias desde tiempo de compilación a tiempo de ejecución.
Algunos de los beneficios de usar la Inyección de Dependencias son la Separación de Preocupaciones, la reducción del código redundante, componentes configurables y pruebas unitarias sencillas.
Lee más en Tutorial de Inyección de Dependencias. También podemos utilizar Google Guice para la Inyección de Dependencias para automatizar el proceso de inyección de dependencias. Pero en la mayoría de los casos, buscamos más que simplemente la inyección de dependencias, y ahí es donde Spring se destaca.
7. ¿Cómo implementamos la Inyección de Dependencias en el Marco de Spring?
Podemos usar la configuración basada en XML de Spring, así como la configuración basada en anotaciones para implementar la Inyección de Dependencias en aplicaciones de Spring. Para comprender mejor, por favor lee el ejemplo de Inyección de Dependencias en Spring donde puedes aprender ambas formas con un caso de prueba JUnit. El post también contiene un archivo zip de un proyecto de muestra que puedes descargar y explorar para aprender más.
8. ¿Cuáles son los beneficios de usar Spring Tool Suite?
Podemos instalar complementos en Eclipse para obtener todas las funciones de Spring Tool Suite. Sin embargo, STS viene con Eclipse con algunas otras funciones importantes, como el soporte para Maven, plantillas para crear diferentes tipos de proyectos de Spring, y tc server para un mejor rendimiento con aplicaciones 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. ¿Nombra algunos de los módulos importantes de Spring?
Algunos de los módulos importantes del framework Spring son:
- Spring Context, para inyección de dependencias.
- Spring AOP, para programación orientada a aspectos.
- Spring DAO, para operaciones de base de datos utilizando el patrón DAO.
- Spring JDBC, para soporte de JDBC y DataSource.
- Spring ORM, para soporte de herramientas ORM como Hibernate.
- Módulo web de Spring, para crear aplicaciones web.
- Spring MVC, implementación del modelo-vista-controlador para crear aplicaciones web, servicios web, etc.
10. ¿Qué entiendes por Programación Orientada a Aspectos?
Las aplicaciones empresariales tienen algunas preocupaciones comunes que atraviesan diferentes partes y son aplicables a diferentes tipos de objetos y módulos de aplicación, como el registro, la gestión de transacciones, la validación de datos, la autenticación, etc. La modularidad de la aplicación se logra mediante clases en la programación orientada a objetos. En AOP, la modularidad de la aplicación se logra mediante Aspectos y se configuran para atravesar diferentes métodos de clase.
AOP elimina la dependencia directa de tareas transversales de las clases que no es posible en la programación orientada a objetos normal. Por ejemplo, podemos tener una clase separada para el registro, pero las demás clases tendrán que llamar a estos métodos. Sin embargo, en AOP configuramos los aspectos y la ejecución del método sucede automáticamente. Lee más sobre el soporte de Spring AOP en Ejemplo de Spring AOP.
11. ¿Qué es Aspecto, Consejo, Punto de Corte, Punto de Unión y Argumentos de Consejo en AOP?
Aspecto: El aspecto es una clase que implementa preocupaciones transversales, como la gestión de transacciones. Los aspectos pueden ser una clase normal configurada y luego configurada en el archivo de configuración de beans de Spring o podemos usar el soporte de AspectJ de Spring para declarar una clase como un Aspecto usando la anotación @Aspect
.
Consejo: El consejo es la acción tomada para un punto de unión particular. En términos de programación, son métodos que se ejecutan cuando se alcanza un punto de unión específico con un punto de corte coincidente en la aplicación. Puedes pensar en el Consejo como interceptores de Spring o Filtros Servlet.
Punto de corte: Los puntos de corte son expresiones regulares que se emparejan con puntos de unión para determinar si se debe ejecutar o no un consejo. El punto de corte utiliza diferentes tipos de expresiones que se emparejan con los puntos de unión. El framework Spring utiliza el lenguaje de expresión de puntos de corte de AspectJ para determinar los puntos de unión donde se aplicarán los métodos de consejo.
Punto de unión: Un punto de unión es un punto específico en la aplicación, como la ejecución de un método, el manejo de excepciones, el cambio de valores de variables de objeto, etc. En Spring AOP, un punto de unión siempre es la ejecución de un método.
Argumentos de Consejos: Podemos pasar argumentos en los métodos de consejos. Podemos usar la expresión args() en el punto de corte para aplicarla a cualquier método que coincida con el patrón de argumentos. Si usamos esto, entonces necesitamos usar el mismo nombre en el método de consejos desde donde se determina el tipo de argumento.
Estos conceptos parecen confusos al principio, pero si pasas por Spring Aspect, Ejemplo de Consejo entonces puedes relacionarte fácilmente con ellos.
12. ¿Cuál es la diferencia entre Spring AOP y AspectJ AOP?
AspectJ es la implementación estándar de la industria para la Programación Orientada a Aspectos mientras que Spring implementa AOP para algunos casos. Las principales diferencias entre Spring AOP y AspectJ son:
- Spring AOP es más fácil de usar que AspectJ porque no necesitamos preocuparnos por el proceso de tejido.
- Spring AOP admite anotaciones de AspectJ, por lo que si estás familiarizado con AspectJ, trabajar con Spring AOP es más fácil.
- Spring AOP solo admite AOP basado en proxy, por lo que solo se puede aplicar a puntos de unión de ejecución de método. AspectJ soporta todo tipo de puntos de corte.
- Una de las limitaciones de Spring AOP es que solo se puede aplicar a los beans creados a través del Contexto de Spring.
13. ¿Qué es el contenedor Spring IoC?
La Inversión de Control (IoC) es el mecanismo para lograr un desacoplamiento entre las dependencias de objetos. Para lograr un desacoplamiento y una vinculación dinámica de los objetos en tiempo de ejecución, los objetos definen sus dependencias que son inyectadas por otros objetos ensambladores. El contenedor Spring IoC es el programa que inyecta dependencias en un objeto y lo prepara para nuestro uso.
Las clases del contenedor IoC del Framework Spring forman parte de los paquetes org.springframework.beans
y org.springframework.context
y nos proporcionan diferentes formas de desacoplar las dependencias de objetos.
Algunas de las implementaciones útiles de ApplicationContext que usamos son;
- AnnotationConfigApplicationContext: Para aplicaciones Java independientes que utilizan configuración basada en anotaciones.
- ClassPathXmlApplicationContext: Para aplicaciones Java independientes que utilizan configuración basada en XML.
- FileSystemXmlApplicationContext: Similar a ClassPathXmlApplicationContext excepto que el archivo de configuración XML se puede cargar desde cualquier lugar del sistema de archivos.
- AnnotationConfigWebApplicationContext y XmlWebApplicationContext para aplicaciones web.
14. ¿Qué es un Spring Bean?
Cualquier clase Java normal que es inicializada por el contenedor Spring IoC se llama Spring Bean. Utilizamos el ApplicationContext
de Spring para obtener la instancia del Spring Bean.
El contenedor Spring IoC gestiona el ciclo de vida del Spring Bean, los alcances de los beans e inyecta cualquier dependencia requerida en el bean.
15. ¿Cuál es la importancia del archivo de configuración del Spring Bean?
Utilizamos el archivo de configuración del Spring Bean para definir todos los beans que serán inicializados por el contexto Spring. Cuando creamos la instancia del ApplicationContext de Spring, lee el archivo XML de beans de primavera e inicializa todos ellos. Una vez que el contexto está inicializado, podemos usarlo para obtener diferentes instancias de beans.
Además de la configuración del Spring Bean, este archivo también contiene interceptores de spring MVC, resolutores de vistas y otros elementos para admitir configuraciones basadas en anotaciones.
16. ¿Cuáles son las diferentes formas de configurar una clase como un Bean de Spring?
Existen tres formas diferentes de configurar un Bean de Spring.
Configuración XML: Esta es la configuración más popular y podemos utilizar el elemento bean en el archivo de contexto para configurar un Bean de Spring. Por ejemplo:
<bean name="myBean" class="com.journaldev.spring.beans.MyBean"></bean>
Configuración basada en Java: Si solo estás utilizando anotaciones, puedes configurar un Bean de Spring utilizando la anotación @Bean
. Esta anotación se utiliza con clases @Configuration
para configurar un Bean de Spring. Un ejemplo de configuración es:
@Configuration
@ComponentScan(value="com.journaldev.spring.main")
public class MyConfiguration {
@Bean
public MyService getService(){
return new MyService();
}
}
Para obtener este bean del contexto de Spring, tenemos que utilizar el siguiente fragmento de código:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
Configuración basada en anotaciones: También podemos utilizar las anotaciones @Component, @Service, @Repository y @Controller con las clases para configurarlas como beans de Spring. Para esto, necesitaríamos proporcionar la ubicación del paquete base para escanear estas clases. Por ejemplo:
<context:component-scan base-package="com.journaldev.spring" />
17. ¿Cuáles son los diferentes alcances de Spring Bean?
Existen cinco alcances definidos para los Spring Beans.
- singleton: Solo se creará una instancia del bean para cada contenedor. Este es el alcance predeterminado para los spring beans. Al utilizar este alcance, asegúrese de que el bean de Spring no tenga variables de instancia compartidas, de lo contrario, podría provocar problemas de inconsistencia de datos porque no es seguro para subprocesos.
- prototipo: Se creará una nueva instancia cada vez que se solicite el bean.
- solicitud: Este es igual que el alcance prototipo, sin embargo, está destinado a ser utilizado para aplicaciones web. Se creará una nueva instancia del bean para cada solicitud HTTP.
- sesión: Se creará un nuevo bean para cada sesión HTTP por parte del contenedor.
- sesión-global: Esto se utiliza para crear beans de sesión globales para aplicaciones de portlet.
El Framework de Spring es extensible y también podemos crear nuestros propios alcances. Pero la mayor parte del tiempo estamos bien con los alcances proporcionados por el framework. Para establecer los alcances de los beans de Spring, podemos utilizar el atributo “scope” en el elemento bean o la anotación @Scope para configuraciones basadas en anotaciones.
18. ¿Cuál es el ciclo de vida del Bean de Spring?
Los Beans de Spring son inicializados por el Contenedor de Spring y todas las dependencias también son inyectadas. Cuando el contexto es destruido, también destruye todos los beans inicializados. Esto funciona bien en la mayoría de los casos, pero a veces queremos inicializar otros recursos o realizar alguna validación antes de hacer que nuestros beans estén listos para usar. El framework de Spring proporciona soporte para métodos de post-inicialización y pre-destrucción en los beans de Spring.
Podemos hacer esto de dos maneras: implementando las interfaces InitializingBean
y DisposableBean
, o utilizando los atributos init-method y destroy-method en las configuraciones de los beans de Spring. Para más detalles, por favor lee Métodos del Ciclo de Vida del Bean de Spring.
19. ¿Cómo obtener el objeto ServletContext y ServletConfig en un Bean de Spring?
Existen dos maneras de obtener objetos específicos del Contenedor en el bean de Spring.
- Implementar las interfaces *Aware de Spring, como las interfaces ServletContextAware y ServletConfigAware, para obtener un ejemplo completo de estas interfaces aware, por favor lee Interfaces Aware de Spring.
- Usando la anotación
@Autowired
con variables de bean de tipoServletContext
yServletConfig
. Funcionarán únicamente en entornos específicos del contenedor de servlets.
@Autowired
ServletContext servletContext;
20. ¿Qué es el enrutamiento de beans y la anotación @Autowired?
El proceso de inyectar dependencias de bean de Spring durante la inicialización se llama enrutamiento de beans de Spring.
Normalmente, es una buena práctica hacer el enrutamiento explícito de todas las dependencias de beans, pero el framework de Spring también admite la autoenrutación. Podemos usar la anotación @Autowired
con campos o métodos para autoenrutamiento por tipo. Para que esta anotación funcione, también necesitamos habilitar la configuración basada en anotaciones en el archivo de configuración de beans de Spring. Esto se puede hacer mediante el elemento context:annotation-config.
Para más detalles sobre la anotación @Autowired
, por favor lee Ejemplo de Autowire de Spring.
21. ¿Cuáles son los diferentes tipos de autowiring de Spring Bean?
Hay cuatro tipos de autowiring en el marco de Spring.
- autowire por nombre
- autowire por tipo
- autowire por constructor
- autowiring por @Autowired y anotaciones @Qualifier
Antes de Spring 3.1, también se admitía autowire por autodetect que era similar a autowire por constructor o por tipo. Para obtener más detalles sobre estas opciones, por favor, lea Autocableado de Beans de Spring.
22. ¿Proporciona Spring Bean seguridad en hilos?
El alcance predeterminado del bean de Spring es singleton, por lo que solo habrá una instancia por contexto. Eso significa que tener una variable de nivel de clase que cualquier hilo pueda actualizar conducirá a datos inconsistentes. Por lo tanto, en el modo predeterminado, los beans de Spring no son seguros para subprocesos.
Sin embargo, podemos cambiar el ámbito del bean de spring a solicitud, prototipo o sesión para lograr la seguridad de subprocesos a costa del rendimiento. Es una decisión de diseño y se basa en los requisitos del proyecto.
23. ¿Qué es un Controlador en Spring MVC?
Al igual que el patrón de diseño MVC, el Controlador es la clase que se encarga de todas las solicitudes del cliente y las envía a los recursos configurados para manejarlas. En Spring MVC, DispatcherServlet es la clase controladora frontal que inicializa el contexto en función de las configuraciones de los beans de spring.
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. ¿Cuál es la diferencia entre @Component, @Controller, @Repository y @Service en Spring?
@Componente se utiliza para indicar que una clase es un componente. Estas clases se utilizan para la detección automática y se configuran como un bean cuando se utilizan configuraciones basadas en anotaciones.
@Controlador es un tipo específico de componente, utilizado en aplicaciones MVC y mayormente utilizado con la anotación RequestMapping.
@Repositorio se utiliza para indicar que un componente se utiliza como un repositorio y un mecanismo para almacenar/recuperar/buscar datos. Podemos aplicar esta anotación con clases de implementación del patrón DAO.
@Servicio se utiliza para indicar que una clase es un servicio. Por lo general, las clases de fachada empresarial que proporcionan algunos servicios están anotadas con esto.
Podemos usar cualquiera de las anotaciones anteriores para una clase para la detección automática, pero se proporcionan diferentes tipos para que pueda distinguir fácilmente el propósito de las clases anotadas.
25. ¿Qué es DispatcherServlet y ContextLoaderListener?
El DispatcherServlet es el controlador frontal en la aplicación Spring MVC y carga el archivo de configuración de beans de Spring, inicializando todos los beans configurados. Si las anotaciones están habilitadas, también escanea los paquetes y configura cualquier bean anotado con las anotaciones @Component, @Controller, @Repository, o @Service.
ContextLoaderListener es el “listener” encargado de iniciar y cerrar el WebApplicationContext raíz de Spring. Sus funciones importantes son vincular el ciclo de vida de ApplicationContext al ciclo de vida de ServletContext y automatizar la creación de ApplicationContext. Podemos utilizarlo para definir beans compartidos que pueden ser utilizados en diferentes contextos de Spring.
26. ¿Qué es ViewResolver en Spring?
Las implementaciones de ViewResolver se utilizan para resolver las páginas de vista por nombre. Lo configuramos en el archivo de configuración de beans de Spring. Por ejemplo:
<!-- Resuelve las vistas seleccionadas para su renderización por @Controllers a recursos .jsp en el directorio /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 es una de las implementaciones de la interfaz ViewResolver, y proporcionamos el directorio de las páginas de vista y la ubicación del sufijo a través de las propiedades del bean. Entonces, si un método del controlador devuelve “home”, el resolvedor de vistas utilizará la página de vista ubicada en /WEB-INF/views/home.jsp.
27. ¿Qué es un MultipartResolver y cuándo se utiliza?
La interfaz MultipartResolver se utiliza para cargar archivos. CommonsMultipartResolver y StandardServletMultipartResolver son dos implementaciones proporcionadas por el marco de Spring para la carga de archivos. Por defecto, no hay resolutores multipartidos configurados, pero para usarlos para cargar archivos, todo lo que necesitamos hacer es definir un bean llamado “multipartResolver” con el tipo MultipartResolver en las configuraciones de beans de Spring.
Una vez configurado, cualquier solicitud multipartido será resuelta por el MultipartResolver configurado y se pasará un HttpServletRequest envuelto. Luego se utiliza en la clase del controlador para obtener el archivo y procesarlo. Para un ejemplo completo, por favor lee Ejemplo de carga de archivos en Spring MVC.
28. ¿Cómo manejar excepciones en el Framework Spring MVC?
El Framework Spring MVC proporciona las siguientes formas para ayudarnos a lograr un manejo robusto de excepciones.
Basado en el controlador – Podemos definir métodos manejadores de excepciones en nuestras clases de controlador. Todo lo que necesitamos es anotar estos métodos con la anotación @ExceptionHandler.
Manejador de excepciones global – El manejo de excepciones es una preocupación transversal y Spring proporciona la anotación @ControllerAdvice que podemos usar con cualquier clase para definir nuestro manejador de excepciones global.
Implementación de HandlerExceptionResolver – Para excepciones genéricas, la mayoría de las veces servimos páginas estáticas. Spring Framework proporciona una interfaz HandlerExceptionResolver que podemos implementar para crear un manejador de excepciones global. La razón detrás de esta forma adicional de definir el manejador de excepciones global es que el framework Spring también proporciona clases de implementación predeterminadas que podemos definir en nuestro archivo de configuración de beans de Spring para obtener beneficios de manejo de excepciones del framework Spring.
Para obtener un ejemplo completo, por favor lee Spring Ejemplo de Manejo de Excepciones.
29. ¿Cómo crear ApplicationContext en un programa Java?
Hay siguientes maneras de crear un contexto de spring en un programa java independiente.
- AnnotationConfigApplicationContext: Si estamos usando Spring en aplicaciones Java independientes y utilizando anotaciones para la configuración, entonces podemos usar esto para inicializar el contenedor y obtener los objetos de bean.
- ClassPathXmlApplicationContext: Si tenemos un archivo de configuración de bean de spring XML en una aplicación independiente, entonces podemos usar esta clase para cargar el archivo y obtener el objeto de contenedor.
- FileSystemXmlApplicationContext: Esto es similar a ClassPathXmlApplicationContext excepto que el archivo de configuración XML se puede cargar desde cualquier lugar en el sistema de archivos.
30. ¿Podemos tener múltiples archivos de configuración de Spring?
Para las aplicaciones de Spring MVC, podemos definir múltiples archivos de configuración de contexto de Spring a través de `contextConfigLocation`. Esta cadena de ubicación puede consistir en múltiples ubicaciones separadas por cualquier número de comas y espacios. Por ejemplo;
<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>
También podemos definir múltiples configuraciones de nivel raíz de Spring y cargarlas a través de `context-param`. Por ejemplo;
<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>
Otra opción es usar el elemento `import` en el archivo de configuración del contexto para importar otras configuraciones, por ejemplo:
<beans:import resource="spring-jdbc.xml"/>
31. ¿Qué es ContextLoaderListener?
`ContextLoaderListener` es la clase de escucha utilizada para cargar el contexto raíz y definir las configuraciones de beans de Spring que serán visibles para todos los demás contextos. Se configura en el archivo `web.xml` como:
<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. ¿Cuáles son las configuraciones mínimas necesarias para crear una aplicación Spring MVC?
Para crear una aplicación Spring MVC simple, necesitaríamos realizar las siguientes tareas.
- Agregar las dependencias `spring-context` y `spring-webmvc` en el proyecto.
- Configura
DispatcherServlet
en el archivo web.xml para manejar las solicitudes a través del contenedor Spring. - Archivo de configuración de beans de Spring para definir beans, si se usan anotaciones entonces debe configurarse aquí. Además, necesitamos configurar el resolutor de vistas para las páginas de vista.
- Clase controladora con asignaciones de solicitudes definidas para manejar las solicitudes del cliente.
Los pasos anteriores deberían ser suficientes para crear una aplicación Spring MVC Hello World simple.
33. ¿Cómo relacionaría el Marco Spring MVC con la arquitectura MVC?
Como su nombre sugiere, Spring MVC está construido sobre la arquitectura Modelo-Vista-Controlador (MVC). DispatcherServlet
es el Front Controller en la aplicación Spring MVC que se encarga de todas las solicitudes entrantes y las delega a diferentes métodos controladores.
El modelo puede ser cualquier Java Bean en el Framework Spring, al igual que cualquier otro framework MVC, Spring proporciona la vinculación automática de datos de formulario a beans Java. Podemos establecer beans de modelo como atributos para ser utilizados en las páginas de vista.
Las páginas de vista pueden ser JSP, HTML estático, etc. y los resolutores de vistas son responsables de encontrar la página de vista correcta. Una vez que se identifica la página de vista, el control se devuelve al controlador DispatcherServlet. DispatcherServlet es responsable de renderizar la vista y devolver la respuesta final al cliente.
Cómo lograr la localización en aplicaciones Spring MVC?
Spring proporciona un excelente soporte para la localización o i18n a través de paquetes de recursos. Los pasos básicos necesarios para hacer que nuestra aplicación sea localizable son:
- Crear paquetes de recursos de mensajes para diferentes locales, como messages_en.properties, messages_fr.properties, etc.
- Definir el bean messageSource en el archivo de configuración de beans de Spring de tipo ResourceBundleMessageSource o ReloadableResourceBundleMessageSource.
- Para admitir un cambio de localidad, defina el bean localeResolver de tipo CookieLocaleResolver y configure el interceptor LocaleChangeInterceptor. Una configuración de ejemplo se muestra a continuación:
<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>
- Utilizar el elemento
spring:message
en las páginas de vista con nombres de clave, DispatcherServlet selecciona el valor correspondiente y renderiza la página en el locale correspondiente y lo devuelve como respuesta.
Para obtener un ejemplo completo, por favor lea Ejemplo de Localización en Spring.
35. ¿Cómo podemos usar Spring para crear un servicio web Restful que devuelva una respuesta JSON?
Podemos utilizar el framework Spring para crear servicios web Restful que devuelvan datos en formato JSON. Spring proporciona integración con la API JSON de Jackson que podemos usar para enviar respuestas JSON en un servicio web Restful.
Para configurar nuestra aplicación Spring MVC y enviar respuestas JSON, debemos seguir los siguientes pasos:
1. Agregar las dependencias de Jackson JSON. Si estás utilizando Maven, puedes hacerlo con el siguiente código:
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind-version}</version>
</dependency>
2. Configurar el bean RequestMappingHandlerAdapter en el archivo de configuración de beans de Spring y establecer la propiedad message converters en el bean MappingJackson2HttpMessageConverter. Una configuración de ejemplo sería:
<!-- Configurar para incluir JSON como solicitud y respuesta en el manejador de métodos -->
<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>
<!-- Configurar bean para convertir JSON a POJO y viceversa -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>
3. En los métodos manejadores del controlador, devolver el objeto como respuesta utilizando la anotación @ResponseBody
. Un código de ejemplo sería:
@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. Puedes invocar el servicio web Rest a través de cualquier API, pero si deseas utilizar Spring, puedes hacerlo fácilmente utilizando la clase RestTemplate.
Para obtener un ejemplo completo, por favor lee Ejemplo de servicio web Restful de Spring.
36. ¿Cuáles son algunas de las anotaciones importantes de Spring que has utilizado?
Algunas de las anotaciones de Spring que he utilizado en mi proyecto son:
- @Controller – para clases de controlador en un proyecto de Spring MVC.
- @RequestMapping – para configurar el mapeo de URI en los métodos del controlador. Esta es una anotación muy importante, así que deberías revisar Ejemplos de Anotaciones RequestMapping de Spring MVC
- @ResponseBody – para enviar un objeto como respuesta, generalmente para enviar datos XML o JSON como respuesta.
- @PathVariable – para mapear valores dinámicos de la URI a los argumentos del método del controlador.
- @Autowired – para el cableado automático de dependencias en beans de primavera.
- @Qualifier – con la anotación @Autowired para evitar confusiones cuando múltiples instancias del mismo tipo de bean están presentes.
- @Service – para clases de servicio.
- @Scope – para configurar el alcance del bean de primavera.
- @Configuration, @ComponentScan y @Bean – para configuraciones basadas en Java.
- Anotaciones de AspectJ para configurar aspectos y consejos, @Aspect, @Before, @After, @Around, @Pointcut, etc.
37. ¿Podemos enviar un Objeto como respuesta del método controlador?
Sí, podemos hacerlo, usando la anotación @ResponseBody. Así es como enviamos una respuesta basada en JSON o XML en servicios web RESTful.
38. ¿Cómo cargar archivos en la aplicación Spring MVC?
Spring proporciona soporte integrado para cargar archivos a través de las implementaciones de la interfaz MultipartResolver. Es muy fácil de usar y solo requiere cambios de configuración para que funcione. Necesitaríamos escribir un método de controlador para manejar el archivo entrante y procesarlo. Para un ejemplo completo, consulta Ejemplo de Carga de Archivos en Spring.
39. ¿Cómo validar datos de formulario en el marco Spring Web MVC?
Spring admite validaciones basadas en anotaciones JSR-303 y también proporciona una interfaz Validator que podemos implementar para crear nuestro propio validador personalizado. Para usar la validación basada en JSR-303, necesitamos anotar las variables de bean con las validaciones requeridas.
Para la implementación de un validador personalizado, necesitamos configurarlo en la clase del controlador. Para un ejemplo completo, por favor lea Ejemplo de validación de formulario Spring MVC.
40. ¿Qué es un Interceptor de Spring MVC y cómo se usa?
Los Interceptors de Spring MVC son como Filtros Servlet y nos permiten interceptar las solicitudes de clientes y procesarlas. Podemos interceptar las solicitudes de clientes en tres lugares – preHandle, postHandle y afterCompletion.
Podemos crear un interceptor de Spring implementando la interfaz HandlerInterceptor o extendiendo la clase abstracta HandlerInterceptorAdapter.
Necesitamos configurar interceptores en el archivo de configuración de beans de Spring. Podemos definir un interceptor para interceptar todas las solicitudes del cliente o también podemos configurarlo para mapeo de URI específico. Para un ejemplo detallado, consulta Ejemplo de Interceptor de Spring MVC.
41. ¿Qué es la clase Spring JdbcTemplate y cómo se utiliza?
El Framework Spring proporciona una excelente integración con la API de JDBC y ofrece la clase de utilidad JdbcTemplate que podemos usar para evitar código redundante en nuestra lógica de operaciones de base de datos, como abrir/cerrar conexiones, ResultSet, PreparedStatement, etc.
Para un ejemplo de JdbcTemplate, consulta Ejemplo de Spring JDBC.
42. ¿Cómo usar Tomcat JNDI DataSource en una aplicación web de Spring?
Para usar un contenedor de servlets configurado con JNDI DataSource, necesitamos configurarlo en el archivo de configuración de beans de Spring y luego inyectarlo en los beans de Spring como dependencias. Luego podemos usarlo con JdbcTemplate
para realizar operaciones en la base de datos.
<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>
Para un ejemplo completo, consulte Ejemplo de Spring Tomcat JNDI.
43. ¿Cómo lograría la gestión de transacciones en Spring?
El framework Spring proporciona soporte para la gestión de transacciones a través de la Gestión de Transacciones Declarativa y la gestión de transacciones programática. La gestión de transacciones declarativa es la más utilizada porque es fácil de usar y funciona en la mayoría de los casos.
Usamos la anotación @Transactional
para la gestión de transacciones declarativa. Necesitamos configurar el administrador de transacciones para el DataSource en el archivo de configuración de beans de Spring.
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
44. ¿Qué es Spring DAO?
El soporte de Spring DAO se proporciona para trabajar con tecnologías de acceso a datos como JDBC, Hibernate de una manera consistente y sencilla. Por ejemplo, tenemos JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport y JpaDaoSupport para las tecnologías respectivas.
Spring DAO también proporciona consistencia en la jerarquía de excepciones y no necesitamos capturar excepciones específicas.
45. ¿Cómo integrar los frameworks Spring e Hibernate?
Podemos utilizar el módulo Spring ORM para integrar los frameworks Spring e Hibernate si estás utilizando Hibernate 3+ donde SessionFactory proporciona la sesión actual, entonces deberías evitar el uso de las clases HibernateTemplate o HibernateDaoSupport y es mejor utilizar el patrón DAO con inyección de dependencias para la integración.
Spring ORM proporciona soporte para el uso de la gestión de transacciones declarativa de Spring, así que deberías utilizar eso en lugar de recurrir al código boilerplate de Hibernate para la gestión de transacciones.
Para una mejor comprensión, deberías revisar los siguientes tutoriales:
46. ¿Qué es Spring Security?
El marco de seguridad de Spring se centra en proporcionar tanto autenticación como autorización en aplicaciones Java. También se encarga de la mayoría de las vulnerabilidades de seguridad comunes, como el ataque CSRF.
Es muy beneficioso y fácil de usar Spring Security en aplicaciones web, a través del uso de anotaciones como @EnableWebSecurity
. Deberías revisar las siguientes publicaciones para aprender cómo usar el marco de seguridad de Spring.
- Seguridad de Spring en Aplicaciones Web Servlet
- Ejemplo de Integración de Spring MVC y Spring Security
47. ¿Cómo inyectar un java.util.Properties en un Bean de Spring?
Hay que definir el bean propertyConfigurer que cargará las propiedades desde el archivo de propiedades dado. Luego podemos usar el soporte de Spring EL para inyectar propiedades en otras dependencias de bean. Por ejemplo:
<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>
Si está utilizando la anotación para configurar el bean de Spring, entonces puede inyectar propiedades de la siguiente manera.
@Value("${maxReadResults}")
private int maxReadResults;
48. ¿Nombre algunos de los patrones de diseño utilizados en el Marco de Primavera?
El Marco de Primavera utiliza muchos patrones de diseño, algunos de los más comunes son:
- Patrón Singleton: Creación de beans con ámbito predeterminado.
- Patrón de Fábrica: Clases de fábrica de beans
- Patrón Prototipo: Alcances de beans
- Patrón Adaptador: Spring Web y Spring MVC
- Patrón Proxy: Soporte para Programación Orientada a Aspectos en Spring
- Patrón de Método de Plantilla: JdbcTemplate, HibernateTemplate, etc.
- Controlador Frontal: DispatcherServlet de Spring MVC
- Objeto de Acceso a Datos: Soporte DAO de Spring
- Inyección de Dependencias y Programación Orientada a Aspectos
49. ¿Cuáles son algunas de las mejores prácticas para el Framework Spring?
Algunas de las mejores prácticas para el Framework Spring son:
- Avoidar números de versión en referencias de esquema, para asegurarse de tener las configuraciones más recientes.
- Dividir las configuraciones de bean de Spring en función de sus preocupaciones, como spring-jdbc.xml, spring-security.xml.
- Para los beans de Spring que se utilizan en varios contextos en Spring MVC, créelos en el contexto raíz e inicialícelos con el listener.
- Configure las dependencias de los beans tanto como sea posible, trate de evitar la auto-inyección tanto como sea posible.
- Para las propiedades a nivel de aplicación, el mejor enfoque es crear un archivo de propiedades y leerlo en el archivo de configuración del bean de Spring.
- Para aplicaciones más pequeñas, las anotaciones son útiles pero para aplicaciones más grandes, las anotaciones pueden convertirse en un dolor. Si tenemos toda la configuración en archivos XML, será más fácil mantenerla.
- Utiliza anotaciones correctas para los componentes para entender fácilmente el propósito. Para los servicios, utiliza @Service y para los beans DAO, utiliza @Repository.
- El framework Spring tiene muchos módulos, utiliza lo que necesites. Elimina todas las dependencias adicionales que suelen agregarse cuando creas proyectos a través de las plantillas de Spring Tool Suite.
- Si estás utilizando Aspectos, asegúrate de mantener el punto de unión lo más estrecho posible para evitar consejos en métodos no deseados. Considera anotaciones personalizadas que sean más fáciles de usar y evita cualquier problema.
- Utiliza la inyección de dependencias cuando haya un beneficio real, no la utilices solo por el bien de un acoplamiento débil.
50. ¿Qué es Spring Boot?
Spring Boot hace que el marco de primavera sea único. Nos proporciona una manera fácil de crear diferentes tipos de aplicaciones Java y adjuntarlas al entorno de tiempo de ejecución del contenedor de servlets. Así obtenemos un único archivo JAR que podemos ejecutar para ejecutar el proyecto. Esto nos ahorra mucho tiempo en obtener el proyecto esquelético listo para implementarse muy rápidamente. De esta manera, podemos enfocarnos más en la lógica comercial en lugar de pasar por el proceso común de construir el código y luego implementarlo en un contenedor de servlets. Dado que es un tema muy amplio, te sugeriría que revises Preguntas de entrevista de Spring Boot.
Eso es todo para las preguntas de la entrevista del marco de primavera. Espero que estas preguntas te ayuden en tu próxima entrevista de Java EE. Seguiré agregando más preguntas a la lista tan pronto como las encuentre. Si conoces más preguntas que deberían ser parte de la lista, asegúrate de agregar un comentario al respecto y lo incluiré.
Source:
https://www.digitalocean.com/community/tutorials/spring-interview-questions-and-answers