Preparación de la entrevista: Resumen de preguntas comunes de la entrevista para Spring / Spring MVC

1. ¿Cuáles son las ventajas del marco Spring?

  1. Ligero: diseño poco intrusivo con contaminación de código extremadamente baja
  2. El mecanismo DI de Spring reduce la complejidad del reemplazo de objetos comerciales, mejora el desacoplamiento entre componentes, facilita la integración y puede integrarse con otros marcos a través de la configuración y la inyección de objetos simples, como Mybatis, Hibernate, Shiro ...
  3. El soporte AOP de Spring permite la gestión centralizada de algunas tareas comunes como seguridad, transacciones, registros, etc., proporcionando así una mejor reutilización
  4. Spring ORM y DAO proporcionan una buena integración con el marco de capas de persistencia de terceros y simplifican el acceso a la base de datos subyacente
  5. Spring no obliga a las aplicaciones a depender completamente de Spring, los desarrolladores son libres de elegir parte o la totalidad del framework Spring

2. ¿Qué es AOP?

AOP: Programación Orientada a Aspectos, para programación orientada a aspectos.
El "aspecto" consiste en encapsular la lógica o la responsabilidad que no está relacionada con el negocio, pero que comúnmente es llamada por el módulo comercial, lo cual es conveniente para reducir el código repetitivo del sistema y el acoplamiento entre módulos, lo que es beneficioso para la operabilidad y la mantenibilidad.

3. ¿Cómo implementar AOP? ¿Cómo se implementa Spring AOP?

  • AOP estático:

Durante la compilación, el aspecto se compila directamente en el archivo de bytecode de destino en forma de bytecode. Entrelazar la lógica AOP en el código durante la compilación requiere un compilador y un tejedor patentados.

Ventajas: El rendimiento de las clases tejidas no se ve afectado.
Desventajas: no lo suficientemente flexible

  • AOP dinámico (proxy dinámico JDK):

En tiempo de ejecución, después de cargar la clase de destino, se genera dinámicamente una clase de proxy para la interfaz y el aspecto se incrusta en la clase de proxy. Java introdujo proxies dinámicos desde 1.3 . El principio de implementación es generar una clase de proxy para la interfaz de negocios del proxy , escribir la lógica de AOP en la clase de proxy, tejer dinámicamente AOP en tiempo de ejecución y usar la reflexión para ejecutar la lógica de tejido.
La implementación principal depende de las clases InvocationHandler y Proxy en el paquete java.lang.reflect.

Ventajas: Soporte nativo de la biblioteca estándar de Java, fácil de usar, no es necesario hacer referencia a paquetes adicionales. Es más flexible que el AOP estático.
Desventajas: la clase con proxy debe ser una interfaz, la flexibilidad es limitada; el uso de la reflexión afectará el rendimiento.

  • Generación de bytes de código dinámico (CGLib):

En tiempo de ejecución, después de cargar la clase de destino, se crea dinámicamente un archivo de código de bytes para generar una subclase de la clase de destino , y la lógica de aspecto se agrega a la subclase.
CGLib es una implementación de generación dinámica de bytes de código. Encapsula la herramienta de generación de código de bytes Asm. El principio es generar una subclase de la clase de destino después de cargar el bytecode de destino durante la operación y agregar lógica de aspecto a la subclase, por lo que Cglib La implementación de AOP no requiere una interfaz .

Ventajas: se puede tejer sin interfaz y tiene una gran flexibilidad.
Desventajas: cuando el método de instancia de la clase de extensión es final, no se puede tejer .


Lógica de uso de proxy en Spring AOP:

  • Si el objeto de destino implementa la interfaz, el proxy dinámico de JDK se usará para implementar AOP de manera predeterminada;
  • Si el objeto de destino no implementa la interfaz, se utiliza la biblioteca CGLIB y Spring convertirá automáticamente entre el proxy dinámico JDK y el proxy dinámico CGLIB.

4. ¿Cómo implementar proxy dinámico?

Referencia: Java Design Pattern-Agent Pattern

La razón por la que los proxys dinámicos solo admiten interfaces es porque Java no admite la herencia múltiple.
Específicamente, puede verificar la implementación de la clase Proxy .

El diagrama de herencia de esas clases de proxy que se generan dinámicamente está destinado a tener una clase principal común llamada Proxy . El mecanismo de herencia de Java condenó a estas clases de proxy dinámico para que no puedan implementar proxy dinámico a la clase, porque la herencia múltiple no es esencialmente factible en Java.

5. ¿Cómo se implementa PageHelper?

Consulte el código fuente para comprender PageHelper .

6. ¿Qué es IoC? ¿Qué es la DI?

IoC, Inversión de control.

La inversión de control (IOC) consiste en entregar los derechos de llamada de los objetos tradicionalmente directamente controlados por el código del programa al contenedor, y ensamblar y administrar los componentes del objeto a través del contenedor.

De esta manera, los objetos se acoplan libremente, son fáciles de probar y son reutilizables funcionalmente (reduciendo la creación de objetos y el consumo de memoria), de modo que la capacidad de mantenimiento, la flexibilidad y la escalabilidad de toda la estructura del programa se vuelven más altas.
Ventajas:

  1. La inyección de dependencia reduce la cantidad de código de aplicación.
  2. Hace que la aplicación sea fácil de probar, las pruebas unitarias ya no necesitan singletons y mecanismos de búsqueda JNDI.
  3. El costo mínimo y la intrusión mínima permiten un acoplamiento suelto.
  4. El contenedor IOC admite la inicialización de estilo hambriento y la carga diferida al cargar servicios.
  • Spring proporciona tres formas principales de configurar los beans en el contenedor de IoC
    según la configuración del archivo XML según la configuración
    de la anotación
    basada en la anotación + configuración explícita del código java

La inyección de dependencia DI (inyección de dependencia) es una forma de ensamblaje de contenedores IoC e inyección de objetos.

A través del mecanismo de inyección de dependencia, la configuración simple puede inyectar los recursos necesarios para completar su propia lógica de negocios, sin tener que preocuparse por la fuente y la implementación específica de los recursos.

Método de inyección DI:
Spring admite la inyección de setter y la inyección de constructor. Por lo general, la inyección de constructor se usa para inyectar las dependencias necesarias. Para las dependencias opcionales, la inyección de setter es una mejor opción. La inyección Setter requiere clases para proporcionar constructores sin parámetros o fábricas estáticas sin parámetros para crear objetos.

7. ¿Cómo funciona IoC?

Consulte la sección Inicializando el contexto de la aplicación .

El principio de realización de IoC es el modo de fábrica más el mecanismo de reflexión .

8. ¿Cuáles son los principales módulos de la primavera?

Siete módulos de Spring Framework

1.
La parte más básica del marco Spring Core proporciona un contenedor de IoC para administrar los beans.

2. Spring Context
proporciona información de contexto basada en beans y extiende JNDI, EJB, correo electrónico, internacionalización, verificación y funciones de programación.

3) Spring DAO
proporciona una capa de abstracción para JDBC, que elimina la larga codificación JDBC y analiza los códigos de error específicos del proveedor de la base de datos, y también proporciona métodos declarativos de gestión de transacciones.

4. Spring ORM
proporciona una capa de integración para las API de mapeo "objeto / relación" de uso común. Estos incluyen JPA, JDO, Hibernate, MyBatis, etc.

5. Spring AOP
proporciona una implementación de programación orientada a aspectos que cumple con las especificaciones de AOP Alliance.

6. Spring Web
proporciona información básica de contexto de desarrollo web, que puede integrarse con otras webs .

7. Spring Web MVC
proporciona la implementación completa de Model-View-Controller para aplicaciones web.

9. ¿El frijol en primavera es seguro para los hilos?

Spring no garantiza la seguridad del hilo de los frijoles.
El bean en el contenedor de resorte predeterminado es singleton. Cuando hay una condición de carrera en el singleton, hay un problema de seguridad del hilo.

10. ¿Spring soporta el alcance de varios frijoles?

  • singleton: modo singleton, en todo el contenedor Spring IoC, solo hay una instancia del bean definido con singleton
  • prototipo: modo de prototipo, cada vez que el bean definido por el prototipo se obtiene a través del método getbean del contenedor (inyectarlo en otro bean o llamar al método getBean () del contenedor mediante programación), se genera una nueva instancia de bean

El alcance de la solicitud, sesión y sesión global solo es válido cuando se usa Spring en una aplicación web

  • solicitud: para cada solicitud HTTP, el bean definido con solicitud generará una nueva instancia, es decir, cada solicitud HTTP generará una instancia de bean diferente.
  • sesión: la misma sesión comparte una instancia de bean.
  • global-session: a diferencia del alcance de la sesión, todas las sesiones comparten una instancia de Bean.

11. Spring mvc proceso de ejecución?

Referencia: flujo de procesamiento de DispatchServlet
Referencia: flujo de procesamiento de descanso

12. ¿Cuál es el papel de @RequestMapping?

@RequestMapping es una anotación utilizada para identificar la asignación entre la dirección de solicitud http y los métodos de la clase Controller.

13. ¿Cuál es el papel de @Autowired?

@Autowired es una anotación que puede anotar variables, métodos y constructores de miembros de clase, lo que permite a spring completar el ensamblaje automático de beans.
El valor predeterminado de @Autowired es la coincidencia por clase, y @Qualifier especifica ensamblar beans por nombre.

14. ¿Qué es la bota de primavera? ¿Por qué usarlo?

Spring Boot Paquete de integración de desarrollo rápido basado en Spring Framework.
Beneficios:

La codificación se vuelve simple La
configuración se vuelve simple La
implementación se vuelve simple El
monitoreo se vuelve simple

15. ¿Cuál es el archivo de configuración central del arranque de primavera?

Spring Boot tiene dos tipos de archivos de configuración, aplicaciones y archivos de arranque.
Spring Boot cargará automáticamente estos dos archivos en la ruta de clase. El formato del archivo es propiedades o yml.

El archivo * .properties tiene la forma de key = value
* .yml tiene la forma de key: value
* .yml Las propiedades cargadas están en orden, pero la anotación @PropertySource no es compatible para importar la configuración. Por lo general, se recomienda usar el archivo yml para ver más vívido

El archivo de configuración de bootstrap está en el nivel del sistema y se usa para cargar configuraciones externas. Por ejemplo, la información de configuración en el centro de configuración también se puede usar para definir atributos que no cambiarán. El archivo bootstatp se carga antes que el archivo de la aplicación
. Perfil de aplicación actual

16. ¿De qué maneras puede el arranque de primavera lograr una implementación en caliente?

Explicaré en detalle más adelante.

17. ¿Cuál es el frijol interno de Spring?

Cuando un bean solo se usa como propiedad de otro bean, se puede declarar como un bean interno. Los beans internos suelen ser anónimos y su alcance es generalmente prototipo.

Tales como:

	<!-- 利用setter注入Dog -->  
    <bean id="d1" class="com.yang.Dog">  
        <property name="name" value="lala"></property>  
        <property name="age" value="9"></property>  
        <property name="style" value="Hashiqi"></property>  
    </bean>  
    <!--利用构造器注入person-->  
    <bean id="d2" class="com.yang.person">  
        <constructor-arg index="0" value="andreny"></constructor-arg>  
        <constructor-arg index="1" value="15454"></constructor-arg>  
        <constructor-arg index="2" value="teacher"></constructor-arg>  
    </bean>  
    
    <bean id="m1" class="com.yang.myshow">  
        <!--内部bean-->
        <property name="dog" ref="d1"></property>  
        <!--内部bean-->
        <property name="p" ref="d2"></property>  
    </bean>  

18. Describa el ciclo de vida de los frijoles en el marco de Spring.

1. El contenedor Spring lee la definición del bean del archivo XML y crea una instancia del bean.
2. Spring llena todos los atributos de acuerdo con la definición del bean.
3. Si el bean implementa la interfaz BeanNameAware, Spring pasa la ID del bean al método setBeanName.
4. Si el bean implementa la interfaz BeanFactoryAware, Spring pasa la beanfactory al método setBeanFactory.
5. Si hay algún BeanPostProcessors asociado con el bean, Spring los llama en el método postProcesserBeforeInitialization ().
6. Si el bean implementa IntializingBean, llame a su método afterPropertySet. Si el bean declara un método de inicialización, llame a este método de inicialización.
7. Si hay BeanPostProcessors asociados con beans, se invocarán los métodos postProcessAfterInitialization () de estos beans.
8. Si el bean implementa DisposableBean, llamará al método destroy ().

19. ¿Cómo inyectar array / colección en primavera?

Spring proporciona la siguiente colección de elementos de configuración: Los
<list>tipos se usan para inyectar una lista de valores, permitiendo el mismo valor.
<set>El tipo se usa para inyectar un conjunto de valores, no está permitido tener el mismo valor.
<map>Los tipos se usan para inyectar un conjunto de pares clave-valor, y las claves y los valores pueden ser de cualquier tipo.
<props>El tipo se usa para inyectar un conjunto de pares clave-valor, y la clave y el valor solo pueden ser de tipo String.

<beans>
  <bean id="at" class="test.array.ArrayTest">
    <property name="names">
      <list>
        <value>aaa</value>
        <value>bbb</value>
      </list>
    </property>
  </bean>
</beans>

20. ¿Cuáles son los métodos para obtener el objeto HttpSession en Spring?

	@RequestMapping("/session")
    public Map test(HttpSession session, String otherParam) {
        ...
    }

O

    @RequestMapping("/session")
    public String setSession(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession();
        ...
   }

21. ¿Cuáles son las formas de implementar ApplicationContext?

Existen las siguientes tres formas de lograrlo:

1. FileSystemXmlApplicationContext: carga el archivo de configuración de IoC del sistema de archivos
2. ClassPathXmlApplicationContext: carga el archivo de configuración de IoC del sistema de archivos
3. WebXmlApplicationContext: obténgalo a través de WebApplicationContextUtils

        //加载单个xml文件
        ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
        //加载多个xml文件
        String[] locations = new String[]{"bean1.xml", "bean2.xml", "bean3.xml"};
        ctx = new FileSystemXmlApplicationContext(locations);
 
        //加载单个xml文件
        ctx = new ClassPathXmlApplicationContext("bean.xml");
        //加载多个xml文件
        locations = new String[]{"bean1.xml", "bean2.xml", "bean3.xml"};
        ctx = new ClassPathXmlApplicationContext(locations);
 
        
        ServletContext servletContext = request.getSession().getServletContext();
        ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

22. ¿Qué patrones de diseño se usan en Spring?

Modo de fábrica, modo singleton, modo proxy, modo adaptador, modo observador ...
Referencia: https://www.cnblogs.com/hwaggLee/p/4510687.html

23. ¿Enumere varios métodos de ensamblaje automático de resorte?

Existen cinco métodos de ensamblaje automático que pueden usarse para indicar al contenedor Spring que use métodos de ensamblaje automático para la inyección de dependencia.
(1) no : el método predeterminado es no realizar el ensamblaje automático y realizar el ensamblaje configurando explícitamente el atributo ref.
(2) byName : Al conectar automáticamente el nombre del parámetro, el contenedor Spring encuentra que el atributo de autoconexión del bean se establece como byname en el archivo de configuración, y luego el contenedor intenta hacer coincidir, ensamblar y bean con el mismo nombre que el atributo bean.
(3) byType : mediante el cableado automático del tipo de parámetro, el contenedor Spring encuentra que el atributo de autoconexión del bean se establece en byType en el archivo de configuración, y luego el contenedor intenta hacer coincidir, ensamblar y los atributos del bean tienen el mismo tipo de bean. Si varios beans cumplen las condiciones, se genera un error.
(4) Constructor: este método es similar a byType, pero debe proporcionarse a los parámetros del constructor. Si no hay un tipo de parámetro de constructor determinado con parámetros, se generará una excepción.
(5) autodetección: primero intente usar el constructor para ensamblar automáticamente, si no funciona, use el método byType.

Publicado 431 artículos originales · elogiados 329 · 170,000 visitas

Supongo que te gusta

Origin blog.csdn.net/No_Game_No_Life_/article/details/105387969
Recomendado
Clasificación