Ensayo de ocho partes de primavera de 2023: preguntas de la entrevista

Resumen de primavera(10)

1. ¿Qué es la primavera?

Spring es un marco de desarrollo Java liviano creado por primera vez por Rod Johnson para resolver el problema de acoplamiento entre la capa de lógica empresarial y otras capas de desarrollo de aplicaciones a nivel empresarial. Es un marco de código abierto liviano, de pila completa (integral) JavaSE/JavaEE en capas que proporciona soporte de infraestructura integral para el desarrollo de aplicaciones Java. Spring se encarga de la infraestructura para que los desarrolladores de Java puedan centrarse en el desarrollo de aplicaciones. La misión más fundamental de Spring es resolver la complejidad del desarrollo de aplicaciones a nivel empresarial, es decir, simplificar el desarrollo de Java.

Spring puede hacer muchas cosas: proporciona funciones ricas para el desarrollo a nivel empresarial, pero la capa inferior de estas funciones depende de sus dos características principales, a saber, la inyección de dependencia (inyección de dependencia, DI) y la programación orientada a aspectos (programación orientada a aspectos , AOP) .

Para reducir la complejidad del desarrollo de Java, Spring adopta las siguientes cuatro estrategias clave

  • Programación ligera y mínimamente invasiva basada en POJO;
  • Acoplamiento flojo mediante inyección de dependencia y orientación de interfaz;
  • Programación declarativa basada en aspectos y convenciones;
  • Reduzca el código repetitivo con aspectos y plantillas.

2. ¿Cuál es el objetivo de diseño, el concepto de diseño y el núcleo del marco Spring?

**Objetivo de diseño de Spring: **Spring proporciona a los desarrolladores una plataforma de desarrollo de aplicaciones liviana e integral;

**Concepto de diseño de Spring: **En el desarrollo de JavaEE, admite los métodos de desarrollo POJO y JavaBean, realiza un desarrollo orientado a aplicaciones, admite totalmente el método de diseño OO (orientado a objetos); Spring implementa la gestión de relaciones de acoplamiento de objetos a través del contenedor IoC y realiza la inversión de dependencia. , entregue las dependencias entre objetos al contenedor de IoC para lograr el desacoplamiento;

**El núcleo del marco Spring: **Contenedor IoC y módulo AOP. Gestione objetos POJO y sus relaciones de acoplamiento a través del contenedor IoC; mejore los servicios de forma dinámica y no intrusiva a través de AOP. IoC mantiene los componentes colaborativos ligeramente acoplados, mientras que la programación AOP le permite separar las funciones en las capas de la aplicación para formar componentes funcionales reutilizables.

3. ¿Cuáles son las ventajas y desventajas de Spring?

**ventaja**

  • Desacoplamiento conveniente, desarrollo simplificado
    Spring es una gran fábrica que puede entregar la creación de todos los objetos y el mantenimiento de las dependencias a la administración de Spring.
  • Soporte de programación AOP
    Spring proporciona programación orientada a aspectos, que puede implementar convenientemente funciones como la interceptación de permisos y el monitoreo de operaciones de programas.
  • Soporte para transacciones declarativas
    La gestión de transacciones se puede completar únicamente mediante configuración, sin programación manual.
  • Cómodas pruebas de programas
    Spring admite Junit4 y puede probar fácilmente los programas Spring mediante anotaciones.
  • Integración conveniente de varios marcos excelentes
    Spring no excluye varios marcos excelentes de código abierto y proporciona soporte directo para varios marcos excelentes (como: Struts, Hibernate, MyBatis, etc.).
  • Reducir la dificultad de usar la API de JavaEE
    Spring proporciona paquetes para algunas API (JDBC, JavaMail, llamadas remotas, etc.) que son muy difíciles de usar en el desarrollo de JavaEE, lo que reduce en gran medida la dificultad de usar estas API.

**defecto**

  • Spring es obviamente un marco muy liviano, pero se siente grande y completo.
  • La primavera depende de la reflexión, la reflexión afecta el rendimiento.
  • Se eleva el umbral de uso y lleva mucho tiempo comenzar con Spring

4. ¿Cuáles son los escenarios de aplicación de Spring?

**Escenario de aplicación: **Desarrollo de aplicaciones empresariales JavaEE, incluidos SSH, SSM, etc.

Valor del resorte:

  • Spring es un marco no intrusivo, el objetivo es minimizar la dependencia del código de la aplicación del marco;
  • Spring proporciona un modelo de programación consistente que permite desarrollar aplicaciones directamente usando POJO y aisladas del entorno operativo;
  • Spring promueve la transformación del estilo de diseño de aplicaciones al desarrollo orientado a objetos y a interfaces, mejorando la reutilización y capacidad de prueba del código;

5. ¿En qué módulos consta Spring?

Spring tiene un total de unos 20 módulos que constan de más de 1300 archivos diferentes. Y estos componentes están integrados en el contenedor central (Core Container), AOP (Programación orientada a aspectos) y soporte de dispositivos (Instrmentation), acceso e integración de datos (Acceso/Integración de datos), Web, mensajes (Mensajería), Pruebas y otros seis módulos intermedios . . El siguiente es el diagrama de estructura del módulo de Spring 5:

[Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-sanguijuela, se recomienda guardar la imagen y cargarla directamente (img-698FA9RN-1692509211712) (Preguntas de la entrevista de primavera del 06 (última versión de 2020) -focus. activos/imagen-20201020183306246.png)]

  • Spring Core: proporciona los componentes básicos del marco, incluidas las funciones de inversión de control (Inversión de control, IOC) e inyección de dependencia (Inyección de dependencia, DI).
  • Spring Beans: se proporciona BeanFactory, que es una implementación clásica del patrón de fábrica. Spring se refiere a los objetos de administración como beans.
  • contexto de primavera: el paquete de contexto creado sobre la base del paquete principal proporciona un método de acceso a objetos estilo marco.
  • spring jdbc: proporciona una capa de abstracción JDBC, que elimina la engorrosa codificación JDBC y el análisis de códigos de error específicos del proveedor de la base de datos, y se utiliza para simplificar JDBC.
  • spring aop: proporciona una implementación de programación orientada a aspectos, lo que le permite personalizar interceptores, cortes de puntos, etc.
  • Spring Web: proporciona funciones integradas para el desarrollo web, como carga de archivos, inicialización del contenedor ioc mediante escuchas de servlet y ApplicationContext para web.
  • prueba de primavera: proporciona principalmente soporte para pruebas y admite pruebas unitarias y pruebas de integración de componentes Spring utilizando JUnit o TestNG.

6. ¿Qué patrones de diseño se utilizan en el marco Spring?

  1. Modo de fábrica: BeanFactory es la encarnación del modo de fábrica simple, que se utiliza para crear instancias de objetos;
  2. Modo singleton: Bean utiliza de forma predeterminada el modo singleton.
  3. Modo proxy: la función AOP de Spring utiliza el proxy dinámico de JDK y la tecnología de generación de código de bytes CGLIB;
  4. Método de plantilla: se utiliza para resolver el problema de la duplicación de código. Por ejemplo: RestTemplate, JmsTemplate, JpaTemplate.
  5. Modo observador: define una dependencia de uno a muchos de las claves de objeto. Cuando el estado de un objeto cambia, todos los objetos que dependen de él serán notificados y actualizados, como la implementación del oyente en Spring: ApplicationListener.

7. Explique en detalle el módulo del contenedor principal (contexto de aplicación de contexto de primavera)

Este es el módulo básico de Spring que proporciona las funciones básicas del marco de Spring, y BeanFactory es el núcleo de cualquier aplicación basada en Spring. El marco Spring se construye sobre este módulo, lo que convierte a Spring en un contenedor.

Bean Factory es una implementación del patrón de fábrica que proporciona una función de inversión de control para separar la configuración y las dependencias de la aplicación del código de la aplicación real. El más utilizado es org.springframework.beans.factory.xml.XmlBeanFactory, que carga beans según la definición en el archivo XML. El contenedor lee los metadatos de configuración del archivo XML y los utiliza para crear un sistema o aplicación completamente configurado.

8. ¿Cuáles son los diferentes tipos de eventos en Spring Framework?

Spring proporciona los siguientes cinco eventos estándar:

  1. Evento de actualización de contexto (ContextRefreshedEvent): se activa cuando se llama al método de actualización () en la interfaz ConfigurableApplicationContext.
  2. Evento de inicio de contexto (ContextStartedEvent): este evento se activa cuando el contenedor llama al método Start() de ConfigurableApplicationContext para iniciar/reiniciar el contenedor.
  3. Evento de detención de contexto (ContextStoppedEvent): este evento se activa cuando el contenedor llama al método Stop() de ConfigurableApplicationContext para detener el contenedor.
  4. Evento de contexto cerrado (ContextClosedEvent): este evento se activa cuando se cierra ApplicationContext. Cuando se cierra un contenedor, todos los beans singleton que gestiona se destruyen.
  5. Evento de solicitud manejada (RequestHandledEvent): en una aplicación web, este evento se activa cuando finaliza una solicitud (solicitud) http. Si un bean implementa la interfaz ApplicationListener, se notifica automáticamente al bean cuando se publica un ApplicationEvent.

9. ¿Cuáles son los diferentes componentes de una aplicación Spring?

Las aplicaciones Spring generalmente tienen los siguientes componentes:

  • Interfaz: define la funcionalidad.
  • Clase Bean: contiene propiedades, métodos de establecimiento y obtención, funciones, etc.
  • Archivo de configuración de Bean: contiene información sobre las clases y cómo configurarlas.
  • Programación orientada a aspectos (AOP) de Spring: proporciona funcionalidad para la programación orientada a aspectos.
  • Programa de usuario : utiliza la interfaz.

10. ¿Cuáles son las formas de utilizar Spring?

Existen las siguientes formas de utilizar Spring:

  • Como una aplicación web Spring completa.
  • Como marco web de terceros, utilice la capa intermedia de Spring Frameworks.
  • Como Java Bean empresarial, puede encapsular POJO (objetos Java antiguos simples) existentes.
  • para uso remoto.

Inversión de control de resorte (IOC) (13)

¿Qué es el contenedor Spring IOC?

La inversión de control es IoC (Inversión de control), que convierte objetos que tradicionalmente son manipulados directamente por el código del programa.

El derecho a llamar al objeto se otorga al contenedor, y el ensamblaje y gestión de los componentes del objeto se realizan a través del contenedor. El llamado "control

El concepto de "transferencia" es la transferencia de control sobre el objeto componente, desde el propio código del programa al contenedor externo.

Spring IOC es responsable de crear objetos, administrar objetos (mediante inyección de dependencia (DI), ensamblar objetos, configurar objetos y administrar todo el ciclo de vida de estos objetos.

¿Qué hace la inversión de control (IoC)?

  • Gestiona la creación de objetos y el mantenimiento de dependencias. La creación de objetos no es una cuestión sencilla: cuando la relación entre objetos es compleja, si el programador necesita mantener la relación de dependencia, es un gran dolor de cabeza.
  • Al desacoplarse, el contenedor mantiene objetos específicos.
  • Alberga el proceso de generación de la clase. Por ejemplo, necesitamos realizar algún procesamiento en el proceso de generación de la clase. El ejemplo más directo es el proxy. Si hay un programa contenedor que pueda entregar esta parte del procesamiento a En el contenedor, la aplicación no necesita preocuparse por cómo se completa la clase.

¿Cuáles son las ventajas de los COI?

  • IOC o Inyección de Dependencia mantiene el tamaño del código de la aplicación al mínimo.
  • Hace que la aplicación sea fácil de probar, las pruebas unitarias no requieren singletons ni mecanismos de búsqueda JNDI.
  • Es posible un acoplamiento flojo con una sobrecarga mínima y una intrusión mínima.
  • El contenedor IOC admite la inicialización hambrienta y la carga diferida al cargar servicios.

Mecanismo de implementación de Spring IoC

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

Ejemplo:

1 interface Fruit {
2 public abstract void eat();
3 }
4
5 class Apple implements Fruit {
6 public void eat(){
7 System.out.println("Apple");
8 }
9 }
10
11 class Orange implements Fruit {
12 public void eat(){
13 System.out.println("Orange");
14 }
15 }
16
17 class Factory {
18 public static Fruit getInstance(String ClassName) {
19 Fruit f=null;
20 try {
21 f=(Fruit)Class.forName(ClassName).newInstance();
22 } catch (Exception e) {
23 e.printStackTrace();
24 }
25 return f;
26 }
27 }
28
29 class Client {
30 public static void main(String[] a) {
31 Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
32 if(f!=null){
33 f.eat();
34 }
35 }
36 }

¿Qué funciones admite el IoC de Spring?

El diseño de IoC de Spring admite las siguientes características: Inyección de dependencias Comprobación de dependencias Autoconexión Compatibilidad con colecciones Especificación de inicializadores y destructores

Admite devolución de llamada para algunos métodos (pero es necesario implementar la interfaz Spring, que es ligeramente intrusiva)

Entre ellos, el más importante es la inyección de dependencia, que es la etiqueta ref en términos de configuración XML. Correspondiente a la primavera

Un objeto RuntimeBeanReference.

Para IoC, lo más importante es el contenedor. El contenedor gestiona el ciclo de vida del Bean y controla la inyección de dependencia del Bean.

¿Cuál es la diferencia entre BeanFactory y ApplicationContext?

BeanFactory y ApplicationContext son las dos interfaces principales de Spring y ambas pueden usarse como contenedores Spring. Donde ApplicationContext es una subinterfaz de BeanFactory.

dependencias

BeanFactory: es la interfaz de nivel más bajo en Spring, que incluye las definiciones de varios beans, lee documentos de configuración de beans, gestiona la carga y la creación de instancias de beans, controla el ciclo de vida de beans y mantiene dependencias entre beans.

La interfaz ApplicationContext se deriva de BeanFactory, además de proporcionar BeanFactory

Además de algunas funciones, también proporciona funciones marco más completas:

  • Hereda MessageSource, por lo que admite la internacionalización. Método unificado de acceso a archivos de recursos.
  • Proporciona eventos para registrar beans en los oyentes.
  • Cargue varios archivos de configuración al mismo tiempo.
  • Cargue múltiples contextos (heredados), cada uno dedicado a una capa específica, como la capa web de la aplicación.

método de carga

BeanFactroy utiliza carga diferida para inyectar beans, es decir, solo cuando se usa un bean (llame a getBean ()), el bean se carga y se crea una instancia. De esta manera, no podemos encontrar algunos problemas de configuración de Spring existentes. Si no se inyecta una determinada propiedad del Bean, después de cargar BeanFacotry, no se lanzará una excepción hasta que se llame al método getBean por primera vez.

ApplicationContext, que crea todos los beans a la vez cuando se inicia el contenedor. De esta forma, cuando se inicia el contenedor, podemos encontrar los errores de configuración en Spring, lo cual es beneficioso para verificar todos

Si se inyecta la propiedad de dependencia. Después de iniciar ApplicationContext, todos los beans de instancia única se precargan. Al precargar beans de instancia única, puede asegurarse de que cuando los necesite, no tenga que esperar porque ya se han creado.

En comparación con BeanFactory básico, la única desventaja de ApplicationContext es que ocupa espacio en la memoria. Cuando la aplicación configura muchos beans, el programa se inicia lentamente.

Método de creación

BeanFactory generalmente se crea mediante programación y ApplicationContext también se puede crear mediante declaración, como usar ContextLoader.

forma de registrarse

Tanto BeanFactory como ApplicationContext admiten BeanPostProcessor,

Se utiliza BeanFactoryPostProcessor, pero la diferencia entre los dos es: BeanFactory debe registrarse manualmente, mientras que ApplicationContext se registra automáticamente.

¿Cómo diseña Spring los contenedores? Explicación detallada de la relación entre BeanFactory y ApplicationContext

El autor de Spring, Rod Johnson, diseñó dos interfaces para representar contenedores.

  • fábrica de frijoles
  • Contexto de aplicación

BeanFactory es simple y grosero, puede entenderse como un HashMap, la clave es BeanName,

El valor es una instancia de Bean. Por lo general, solo se proporcionan funciones de registro (poner) y acceso (obtener). Podemos llamarlo "contenedor de bajo nivel".

ApplicationContext se puede denominar "contenedor de alto nivel". Porque tiene más funciones que BeanFactory. Hereda múltiples interfaces. Por tanto, tiene más funciones. Por ejemplo, adquisición de recursos, soporte para varios mensajes (como soporte de etiquetas JSP) y más soporte a nivel de herramienta para BeanFactory. Como puede ver su nombre, ya no es una fábrica como BeanFactory, sino un "contexto de aplicación", que representa todas las funciones de todo el contenedor grande. Esta interfaz define un método de actualización, que es el método más familiar para cualquiera que lea el código fuente de Spring y se utiliza para actualizar todo el contenedor, es decir, recargar/actualizar todos los beans.

Por supuesto, además de estas dos interfaces principales, existen otras interfaces auxiliares, por lo que no las presentaré aquí.

La relación entre BeanFactory y ApplicationContext

Para mostrar la relación entre "contenedor de bajo nivel" y "contenedor de alto nivel" de manera más intuitiva, aquí utilizamos el uso común

Clase ClassPathXmlApplicationContext para mostrar la relación jerárquica UML de todo el contenedor.

[Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-sanguijuela, se recomienda guardar la imagen y cargarla directamente (img-p5IbE3qY-1692509211712) (Preguntas de la entrevista de primavera de 06 (última versión de 2020) -focus. Jerarquía de activos/contenedores .png)]

un poco complicado? Que no cunda el pánico, déjame explicarte.

El de arriba es BeanFactory, y los tres verdes de abajo son todas interfaces de extensión de funciones, por lo que no hablaré de eso aquí.

Mire el "contenedor de alto nivel" rosa que pertenece a ApplicationContext a continuación, que depende del "contenedor de bajo nivel", aquí estamos hablando de dependencia, no de herencia. Se basa en la función getBean del "contenedor de bajo nivel".

capaz. El contenedor avanzado tiene más funciones: admite diferentes fuentes de información, puede acceder a recursos de archivos y admite eventos de aplicaciones (modo observador).

Normalmente lo que ve el usuario es el "contenedor avanzado". ¡Pero BeanFactory también es muy útil! El área gris a la izquierda es el "contenedor de bajo nivel", que solo carga Bean y obtiene Bean. Otras funciones avanzadas de los contenedores no están disponibles. Por ejemplo, la actualización en la imagen de arriba actualiza todas las configuraciones de Bean Factory, devoluciones de llamadas de eventos del ciclo de vida, etc.

resumen

Habiendo dicho todo esto, me pregunto si entiendes Spring IoC. Aquí hay un resumen: en Spring, IoC se puede implementar solo con contenedores de bajo nivel, 2 pasos:

  1. Cargue el archivo de configuración, analícelo en BeanDefinition y colóquelo en el mapa.

  2. Al llamar a getBean, del mapa al que pertenece BeanDefinition, saque

Se crea una instancia del objeto de clase y, al mismo tiempo, si hay una dependencia, se llamará recursivamente al método getBean, completando la inyección de dependencia.

Lo anterior es el IoC del contenedor de bajo nivel Spring (BeanFactory).

En cuanto al contenedor de alto nivel ApplicationContext, contiene las funciones del contenedor de bajo nivel. Cuando ejecuta el método de plantilla de actualización, actualizará los beans de todo el contenedor. Al mismo tiempo, como contenedor avanzado, contiene demasiadas funciones. En una palabra, no es sólo COI. Apoya diferentes fuentes de información, apoya

La clase de herramienta BeanFactory admite contenedores jerárquicos, admite acceso a recursos de archivos, admite notificaciones de publicación de eventos, admite devoluciones de llamadas de interfaz y más.

¿Cuál es la implementación habitual de ApplicationContext?

FileSystemXmlApplicationContext: este contenedor carga la definición de beans desde un archivo XML y se debe proporcionar a su constructor el nombre de ruta completo del archivo de configuración del Bean XML.

ClassPathXmlApplicationContext: este contenedor también carga definiciones de beans desde un archivo XML; aquí debe configurar el classpath correctamente porque este contenedor buscará configuraciones de beans en el classpath.

WebXmlApplicationContext: este contenedor carga un archivo XML que define todos los beans de una aplicación WEB.

¿Qué es la inyección de dependencia de Spring?

La inversión de control IoC es un concepto amplio y se puede implementar de diferentes maneras. Hay dos métodos de implementación principales: inyección de dependencia y búsqueda de dependencia Inyección de dependencia: en comparación con IoC, la inyección de dependencia (DI) describe con mayor precisión el concepto de diseño de IoC. La llamada inyección de dependencia (Inyección de dependencia), es decir, las dependencias entre componentes están determinadas por el contenedor durante el tiempo de ejecución del sistema de aplicación, es decir, el contenedor inyecta dinámicamente una instancia de objeto de destino de una determinada dependencia en cada componente asociado. en el sistema de aplicación entre. Los componentes no realizan consultas de ubicación, solo proporcionan métodos Java comunes para que el contenedor determine las dependencias.

Principios básicos de la inyección de dependencia

El principio básico de la inyección de dependencia es que los componentes de la aplicación no deben ser responsables de encontrar recursos u otros objetos colaboradores dependientes. El trabajo de configuración de objetos debe ser responsabilidad del contenedor de IoC, y la lógica de "encontrar recursos" debe extraerse del código del componente de la aplicación y entregarse al contenedor de IoC. El contenedor es el único responsable del ensamblaje de componentes y pasará los objetos que cumplan con las dependencias a los objetos requeridos a través de propiedades (establecedores en JavaBean) o constructores.

¿Cuáles son las ventajas de la inyección de dependencia?

La razón por la que la inyección de dependencia es más popular es que es una forma más deseable: dejar que el contenedor asuma toda la responsabilidad de la búsqueda de dependencias, y los componentes administrados solo necesitan exponer los métodos de establecimiento de JavaBean o los constructores o receptores parametrizados.

Puerto que permite al contenedor ensamblar las dependencias del objeto en el momento de la inicialización. En comparación con el método de búsqueda dependiente, sus principales ventajas son:

  • Las operaciones de búsqueda son completamente independientes del código de la aplicación.
  • La API independiente del contenedor facilita el uso de objetos de aplicación fuera de cualquier contenedor.
  • No se requiere ninguna interfaz especial y la mayoría de los objetos pueden ser completamente independientes del contenedor.

¿Cuáles son los diferentes tipos de implementaciones de inyección de dependencia?

La inyección de dependencia es la implementación de IoC más popular hoy en día. La inyección de dependencia se divide en inyección de interfaz (Inyección de interfaz), inyección de método Setter (Inyección de constructor) e inyección de constructor (Inyección de constructor).

Inyección) de tres formas. Entre ellos, la inyección de interfaz se ha abandonado desde Spring 4 debido a su escasa flexibilidad y facilidad de uso.

Inyección de dependencia del constructor: la inyección de dependencia del constructor se implementa mediante el contenedor que activa el constructor de una clase que tiene una serie de parámetros, cada parámetro representa una dependencia de otras clases.

Inyección del método Setter: La inyección del método Setter consiste en llamar al método setter del bean después de que el contenedor crea una instancia del bean llamando al constructor sin argumentos o al método de fábrica estático sin argumentos, que realiza la inyección de dependencia basada en setter.

La diferencia entre la inyección de dependencia del constructor y la inyección del método setter

inyección constructora inyección de colocador
sin inyección parcial parcialmente inyectado
No anulará las propiedades del establecimiento anulará la propiedad del establecimiento
Cualquier modificación creará una nueva instancia. Cualquier modificación no creará una nueva instancia.
Bueno para configurar muchas propiedades. Bueno para configurar una pequeña cantidad de propiedades.

Se pueden utilizar ambos métodos de dependencia, inyección de constructor y inyección de método de establecimiento. La mejor solución es utilizar parámetros de constructor para dependencias obligatorias y métodos de establecimiento para dependencias opcionales.

Frijoles Spring (19) ¿Qué son los frijoles Spring?

Los Spring Beans son aquellos objetos Java que forman la columna vertebral de una aplicación Spring. Son inicializados, ensamblados y administrados por el contenedor Spring IOC. Estos beans se crean a partir de metadatos configurados en el contenedor. Por ejemplo, definido en forma de archivo XML.

¿Qué contiene una definición de Spring Bean?

Una definición de Spring Bean contiene todos los metadatos de configuración que el contenedor debe conocer sobre el bean, los detalles de su ciclo de vida y sus dependencias.

¿Cómo crear una forma de proporcionar metadatos de configuración al contenedor Spring? Spring tiene varios métodos de configuración.

Hay tres formas importantes de proporcionar metadatos de configuración al contenedor Spring.

  • Archivo de configuración XML.
  • Configuración basada en anotaciones.
  • Configuración basada en Java.

¿Qué información contiene el archivo de configuración de Spring?

El archivo de configuración de Spring es un archivo XML que contiene información de clase, describe cómo configurarlas y cómo llamarse entre sí.

Varias formas para que Spring inyecte beans basados ​​en xml

  1. Establecer método de inyección;

  2. Inyección de constructor: ①Establezca la posición del parámetro por índice; ②Establezca el tipo de parámetro por tipo;

  3. inyección estática de fábrica;

  4. fábrica de instancias;

¿Cómo se define el alcance de una clase?

Al definir un bean en Spring, también podemos declarar un alcance para el bean. Se puede definir a través del atributo de alcance en la definición del bean. Por ejemplo, cuando Spring necesita generar una nueva instancia de bean cada vez, el atributo de alcance del bean se especifica como prototipo. Por otro lado, un bean debe devolver la misma instancia cada vez que se utiliza y el atributo de alcance del bean debe establecerse en singleton.

Explicar el alcance de varios beans admitidos por Spring.

El marco Spring admite los siguientes cinco alcances de beans:

  • singleton: el bean tiene solo una instancia por contenedor Spring ioc.
  • prototipo: una definición de bean puede tener varias instancias.
  • solicitud: se crea un bean para cada solicitud http y este alcance solo es válido en el caso de un SpringApplicationContext basado en web.
  • sesión: en una sesión HTTP, una definición de bean corresponde a una instancia. Este alcance solo es válido en el caso de un Spring ApplicationContext basado en web.
  • sesión global: en una sesión HTTP global, una definición de bean corresponde a un

instancia. Este alcance solo es válido en el caso de un Spring ApplicationContext basado en web.

Nota: El alcance predeterminado de Spring Bean es Singleton. El uso del alcance del prototipo requiere una reflexión cuidadosa, porque la creación y destrucción frecuentes de beans generarán una gran sobrecarga de rendimiento.

¿Son los beans singleton en Spring framework seguros para subprocesos?

No, los beans singleton en el marco Spring no son seguros para subprocesos.

El bean en Spring tiene por defecto el modo singleton y el marco de Spring no realiza procesamiento de encapsulación de subprocesos múltiples en el bean singleton.

De hecho, la mayoría de las veces, los spring beans no tienen estado (como la clase dao) y todos los beans también son seguros hasta cierto punto, pero si el bean tiene estado (como los objetos del modelo de vista), depende del desarrollador garantizar la seguridad del hilo. La forma más sencilla es cambiar el alcance del bean,

Cambie "singleton" a "prototipo", de modo que el bean de solicitud sea equivalente a new Bean (), de modo que se pueda garantizar la seguridad de los subprocesos.

  • Tener estado es tener una función de almacenamiento de datos.
  • Sin estado significa que no se guardan datos.

¿Cómo maneja Spring los problemas de concurrencia de subprocesos?

En general, solo los beans sin estado se pueden compartir en un entorno de subprocesos múltiples. En Spring, la mayoría de los beans se pueden declarar como ámbitos singleton, porque Spring usa ThreadLocal para procesar estados no seguros para subprocesos en algunos beans. Resuelve problemas de seguridad de subprocesos.

Tanto ThreadLocal como los mecanismos de sincronización de subprocesos están diseñados para resolver el problema de conflicto de acceso de la misma variable en múltiples subprocesos. El mecanismo de sincronización adopta el método "tiempo por espacio", solo se proporciona una variable y diferentes subprocesos.

Es necesario adquirir el bloqueo y los subprocesos que no adquieren el bloqueo deben ponerse en cola. Y ThreadLocal adopta el método de "espacio por tiempo".

ThreadLocal proporcionará a cada subproceso una copia independiente de variables, aislando así los conflictos de acceso a datos de múltiples subprocesos. Debido a que cada hilo tiene su propia copia de la variable, no es necesario sincronizar la variable. ThreadLocal proporciona un objeto compartido seguro para subprocesos. Al escribir código multiproceso, las variables inseguras se pueden encapsular en ThreadLocal. Explicar el ciclo de vida del frijol en el marco de Spring.

En las aplicaciones Java tradicionales, el ciclo de vida del bean es muy simple. Se crea una instancia del bean utilizando la palabra clave Java new y, a continuación, el bean está listo para usarse. Una vez que el bean ya no se utiliza, Java lo recolecta automáticamente como basura. Por el contrario, el ciclo de vida de los beans en el contenedor Spring es relativamente más complicado. Es muy importante comprender correctamente el ciclo de vida de Spring beans, porque es posible que necesite utilizar los puntos de extensión proporcionados por Spring para personalizar el proceso de creación de beans. La siguiente figura muestra un proceso típico del ciclo de vida de la carga de beans en el contexto de la aplicación Spring.

[Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-sanguijuela, se recomienda guardar la imagen y cargarla directamente (img-gG50NCsq-1692509211713) (Preguntas de la entrevista de primavera de 06 (última versión de 2020) -focus. activos/ciclo de vida del frijol.png)]

Los beans pasan por varias etapas desde la creación hasta la destrucción en el contenedor Spring, y cada etapa se puede personalizar según la forma en que Spring administra los beans.

Como puede ver, la fábrica de frijoles realiza varios pasos de inicio antes de que el frijol esté listo.

Describimos la figura anterior en detalle:

Spring crea una instancia del bean;

Spring inyecta el valor y la referencia del bean en la propiedad correspondiente del bean;

Si el bean implementa la interfaz BeanNameAware, Spring pasa el ID del bean al método setBeanName();

Si el bean implementa la interfaz BeanFactoryAware, Spring llamará al método setBeanFactory()

método, pasando la instancia del contenedor BeanFactory;

Si el bean implementa la interfaz ApplicationContextAware, Spring llamará al método setApplicationContext() para pasar la referencia del contexto de la aplicación donde se encuentra el bean;

Si los beans implementan la interfaz BeanPostProcessor, Spring llamará a su post-

Método ProcessBeforeInitialization();

Si los beans implementan la interfaz InitializingBean, Spring llamará a su método afterPropertiesSet(). De manera similar, si un bean declara un método de inicialización usando initmethod,

Este método también será llamado;

Si los beans implementan la interfaz BeanPostProcessor, Spring llamará a su post-

Método ProcessAfterInitialization(); en este punto, los beans están listos para ser utilizados por la aplicación y siempre residirán en el contexto de la aplicación hasta que se destruya el contexto de la aplicación;

Si el bean implementa la interfaz desechableBean, Spring llamará a su método de interfaz destroy()

Ley. Del mismo modo, si el bean declara un método de destrucción utilizando el método de destrucción, también se llamará a ese método.

Ahora sabes cómo crear y cargar un contenedor Spring. Pero un contenedor vacío no tiene mucho valor, no contiene nada hasta que le pones algo. pedido desde primavera

Para beneficiarnos de DI (Inyección de dependencia), debemos ensamblar el objeto de la aplicación en el contenedor Spring.

¿Cuáles son los métodos importantes del ciclo de vida del frijol? ¿Puedes sobrecargarlos?

Hay dos métodos importantes para el ciclo de vida de los beans. El primero es la configuración, que carga los beans en el contenedor.

se llama tiempo. El segundo método es el desmontaje, que se llama cuando el contenedor descarga la clase.

La etiqueta bean tiene dos atributos importantes (método de inicio y método de destrucción). Con ellos usted mismo puede personalizar los métodos de inicialización y cierre de sesión. También tienen anotaciones correspondientes ( @PostConstruct y @PreDestroy ).

¿Cuáles son los frijoles internos de Spring? ¿Qué son los frijoles internos Spring?

En el marco de Spring, cuando un bean solo se usa como propiedad de otro bean, se puede declarar como un bean interno. Los beans internos se pueden implementar inyectando "propiedades" con establecedores e inyectando "parámetros de construcción" con constructores. Los beans internos suelen ser anónimos y su alcance es generalmente prototipo.

¿Cómo inyectar una colección de Java en Spring?

Spring proporciona los siguientes elementos de configuración para las colecciones: Los tipos se utilizan para inyectar una lista de valores, permitiendo valores idénticos.

Los tipos se utilizan para inyectar un conjunto de valores, no se permiten valores idénticos.

El tipo se utiliza para inyectar un conjunto de pares clave-valor, y tanto la clave como el valor solo pueden ser de tipo Cadena.

¿Qué es el cableado de frijoles?

Ensamblaje, o ensamblaje de beans, se refiere al ensamblaje de beans en el contenedor Spring, siempre que el contenedor necesite conocer las dependencias de los beans y cómo ensamblarlos mediante inyección de dependencias.

¿Qué es el cableado automático de frijoles?

En el marco de Spring, es un buen mecanismo para establecer las dependencias de los beans en el archivo de configuración.

El contenedor Spring puede ensamblar automáticamente beans que cooperan entre sí, lo que significa que el contenedor no necesita configuración y puede pasar

La colaboración entre beans se maneja automáticamente a través de una fábrica de Bean. Esto significa que Spring puede pasar al Bean.

El método de inyección en Factory maneja automáticamente las dependencias entre beans. El cableado automático se puede configurar por frijol o en frijoles específicos.

Explique las diferentes formas de cableado automático, ¿cuáles son las formas de cableado automático de primavera?

En primavera, los objetos no necesitan encontrar ni crear otros objetos asociados con ellos. El contenedor es responsable de asignar referencias de objetos que deben cooperar entre sí a cada objeto, y autowire se utiliza para configurar el modo de carga automática.

Hay 5 tipos de ensamblaje automático en la configuración xml de Spring framework:

  • no: el método predeterminado no es realizar el ensamblaje automático y el ensamblaje del bean se realiza configurando manualmente el atributo ref.
  • byName: ensambla automáticamente por nombre de bean, si la propiedad de un bean es la misma que el nombre de otro bean, se ensamblará automáticamente.
  • byType: Autoconexión por el tipo de datos del parámetro.
  • constructor: el constructor se utiliza para el ensamblaje y los parámetros del constructor se ensamblan por tipo.
  • autodetect: Detección automática, si hay un método de construcción, se ensamblará automáticamente por construcción, de lo contrario, se ensamblará automáticamente por tipo.

¿Cuál es el proceso de cableado automático con la anotación @Autowired?

Utilice la anotación @Autowired para conectar automáticamente beans especificados. Antes de utilizar la anotación @Autowired, es necesario configurarla en el archivo de configuración de Spring.

Al iniciar el IoC de primavera, el contenedor carga automáticamente un

El posprocesador AutowiredAnnotationBeanPostProcessor, cuando el contenedor escanea @Autowied, @Resource o @Inject, automáticamente encontrará el bean requerido en el contenedor IoC y lo ensamblará con las propiedades del objeto. Cuando use @Autowired, primero consulte el bean del tipo correspondiente en el contenedor:

  • Si el resultado de la consulta es exactamente uno, ensamble el bean con los datos especificados por @Autowired;
  • Si hay más de un resultado de consulta, @Autowired buscará por nombre;
  • Si el resultado de la búsqueda anterior está vacío, se generará una excepción. Como solución alternativa, utilice require=false.

¿Cuáles son las limitaciones del cableado automático?

Las limitaciones del cableado automático son: Anulación: aún necesita definir dependencias y configurarlas, lo que significa que el cableado automático siempre debe anularse.

Tipos de datos primitivos: no puede conectar automáticamente propiedades simples como tipos de datos primitivos, cadenas de caracteres y clases.

Funciones difusas: el cableado automático no es tan preciso como el cableado explícito y, si es posible, se recomienda el cableado explícito.

¿Puedes inyectar una cadena nula y vacía en Spring?

Poder

Anotaciones de primavera (8)

¿Qué es la configuración de anotaciones Spring basada en Java? Dé algunos ejemplos de anotaciones

Configuración basada en Java, que le permite realizar la mayor parte de su configuración de Spring con la ayuda de algunas anotaciones de Java en lugar de archivos XML.

Tome la anotación @Configuration como ejemplo, se usa para marcar que una clase puede considerarse como una definición de bean y es

Utilizado por el contenedor Spring IOC.

Otro ejemplo es la anotación @Bean, que indica que este método devolverá un objeto registrado como bean en el contexto de la aplicación Spring.

1	@Configuration
2	public class StudentConfig {
3	@Bean
4	public StudentBean myStudent() {
5	return new StudentBean();
6	}
7	}

¿Cómo habilitar el ensamblaje de anotaciones?

El ensamblaje de anotaciones no está habilitado de forma predeterminada. Para utilizar el ensamblaje de anotaciones, debemos configurar elementos en el archivo de configuración de Spring.

¿Cuál es la diferencia entre @Component, @Controller, @Repository, @Service?

@Component: esto marca la clase java como un bean. Es un estereotipo genérico para cualquier componente administrado por Spring. El mecanismo de escaneo de componentes de Spring ahora puede recogerlo y llevarlo al entorno de la aplicación.

@Controller: esto marca una clase como controlador Spring Web MVC. Los beans marcados con él se importan automáticamente al contenedor de IoC.

@Service: esta anotación es una especialización de anotaciones de componentes. No proporciona ningún comportamiento adicional a las anotaciones @Component. Puede usar @Service en lugar de @Component en sus clases de capa de servicio, ya que especifica la intención de una mejor manera.

@Repository: esta anotación es una especialización de la anotación @Component con propósito y funcionalidad similares. Proporciona beneficios adicionales para las DAO. Importa DAO al contenedor de IoC y hace que las excepciones no comprobadas sean elegibles para convertirse en Spring DataAccessException.

¿Qué hace la anotación @Required?

Esta anotación indica que las propiedades del bean deben establecerse en el momento de la configuración, a través de un valor de propiedad explícito definido por un bean o mediante ensamblaje automático. Si la propiedad del bean de la anotación @Required no está establecida, el contenedor arrojará

BeanInitializationException. Ejemplo:

1	public class Employee {
2	private String name;
3	@Required
4	public void setName(String name){
5	this.name=name;
6	}
7	public string getName(){
8	return name;
9	}
10	}

¿Qué hace la anotación @Autowired?

@Autowired se inyecta según el tipo de ensamblaje de forma predeterminada. De forma predeterminada, requiere que existan objetos dependientes (puede establecer su atributo requerido en falso). La anotación @Autowired proporciona un control más detallado sobre dónde y cómo se realiza el cableado automático. Su uso es el mismo que @Required para modificar métodos de establecimiento, constructores, propiedades o métodos PN con nombres arbitrarios y/o múltiples parámetros.

1	public class Employee {
2	private String name;
3	@Autowired
4	public void setName(String name) {
5	this.name=name;
6	}
7	public string getName(){
8	return name;
9	}
10	}

Diferencia entre @Autowired y @Resource

@Autowired se puede utilizar para: constructores, variables miembro, métodos Setter

Diferencia entre @Autowired y @Resource

@Autowired se inyecta según el tipo de ensamblaje de forma predeterminada. De forma predeterminada, requiere que existan objetos dependientes (puede establecer su atributo requerido en falso).

@Resource se ensambla e inyecta por nombre de forma predeterminada, y solo cuando no se encuentre ningún bean que coincida con el nombre se ensamblará e inyectará por tipo.

¿Qué hace la anotación @Qualifier?

Cuando crea varios beans del mismo tipo y desea conectar solo uno de ellos con una propiedad, puede usar la anotación @Qualifier con @Autowired para eliminar la ambigüedad especificando qué bean exacto debe conectarse.

¿Para qué sirve la anotación @RequestMapping?

La anotación @RequestMapping se utiliza para asignar un método de solicitud HTTP específico a una clase/método específico en el controlador que manejará la solicitud correspondiente. Esta anotación se puede aplicar en dos niveles:

  • Nivel de clase: asignación de URL solicitadas
  • Nivel de método: mapeo de URL y métodos de solicitud HTTP

Acceso a datos de primavera (14)

Módulo de integración de mapeo relacional/objeto de interpretación

Al proporcionar módulos ORM, Spring nos permite utilizar una herramienta de mapeo de objetos/relacional (ORM) además de JDBC directo. Spring admite la integración de marcos ORM convencionales, como Hiberate, JDO e iBATIS, JPA, TopLink, JDO, OJB. La gestión de transacciones de Spring también es compatible con todos los marcos ORM y JDBC anteriores.

¿Cómo utilizar JDBC de forma más eficaz en Spring Framework?

Con el marco Spring JDBC, se mitiga la sobrecarga de la gestión de recursos y el manejo de errores. entonces el desarrollador

Simplemente escriba declaraciones y consultas para acceder a los datos desde los datos, JDBC también se puede usar de manera más eficiente con la ayuda de las clases de plantilla proporcionadas por el marco Spring, esta plantilla se llama JdbcTemplate

Explicar la abstracción JDBC y el módulo DAO.

Al utilizar la abstracción JDBC y el módulo DAO, el código de la base de datos se mantiene conciso y puede evitar problemas causados ​​por el cierre incorrecto de los recursos de la base de datos. Proporciona una capa de acceso de excepción unificada además de varios mensajes de error de la base de datos. También utiliza el módulo AOP de Spring para proporcionar servicios de gestión de transacciones para objetos en aplicaciones Spring.

¿Para qué sirve Spring DAO?

Spring DAO (Data Access Objects) crea objetos de acceso a datos como JDBC, Hibernate o JDO

Preguntar a la tecnología es más fácil de trabajar de forma unificada. Esto facilita a los usuarios cambiar entre tecnologías de persistencia.

También le permite escribir código sin tener que preocuparse por detectar excepciones que son diferentes para cada tecnología.

¿Qué clases existen en la API JDBC de primavera?

Plantilla Jdbc

Plantilla Jdbc simple

NamedParameterJdbcTemplate

SimpleJdbcInsertar

SimpleJdbcCall

¿Qué es JdbcTemplate?

La clase JdbcTemplate proporciona muchos métodos convenientes, como convertir datos de bases de datos en tipos de datos u objetos básicos, ejecutar declaraciones de operaciones de bases de datos escritas o invocables y proporcionar manejo personalizado de errores de datos.

¿Cómo utilizar Spring para acceder a Hibernate? ¿Cuáles son las formas de acceder a Hibernate usando Spring?

Hay dos formas de acceder a Hibernate en Spring:

  • Inversión de control mediante plantillas de hibernación y devoluciones de llamada
  • ernateDAOSupport y aplicar el nodo interceptor AOP

¿Cómo combinar Spring e Hibernate extendiendo Hib a través de HibernateDaoSupport?

Llame a LocalSessionFactory con SessionFactory de Spring. El proceso de integración se divide en tres pasos:

  • Implementación de Hibernate SessionFactory
  • Heredar HibernateDaoSupport para implementar un DAO
  • Montar en una transacción compatible con AOP

¿Cuáles son los tipos de gestión de transacciones admitidas por Spring y cuáles son los métodos de implementación de las transacciones de Spring?

Spring admite dos tipos de gestión de transacciones: Gestión de transacciones programática: esto significa que usted gestiona las transacciones mediante programación, lo que le brinda una gran flexibilidad, pero es difícil de mantener.

Gestión de transacciones declarativa: esto significa que puede separar el código comercial de la gestión de transacciones y solo necesita utilizar anotaciones y configuración XML para gestionar las transacciones.

Método de implementación y principio de la transacción Spring.

La esencia de las transacciones Spring es en realidad el soporte de la base de datos para las transacciones. Sin el soporte de transacciones de la base de datos,

Spring no puede proporcionar funciones de transacción. La confirmación y reversión de transacciones de la capa de base de datos real se implementan mediante binlog o redo log.

Hable sobre el comportamiento de propagación de transacciones de Spring.

El comportamiento de propagación de las transacciones de Spring se refiere a cómo Spring maneja el comportamiento de estas transacciones cuando existen varias transacciones al mismo tiempo.

① PROPAGATION_REQUIRED: Si no hay una transacción actual, cree una nueva transacción. Si hay una transacción actual, únase a la transacción. Esta configuración es la configuración más utilizada.

② PROPAGATION_SUPPORTS: admite la transacción actual, si hay una transacción actualmente, únase a la transacción, si no hay ninguna transacción actualmente, ejecútela como una no transacción.

③ PROPAGATION_MANDATORY: admite la transacción actual, si hay una transacción actualmente, se unirá a la transacción, si no hay ninguna transacción actualmente, se lanzará una excepción.

④ PROPAGATION_REQUIRES_NEW: cree una nueva transacción, independientemente de si existe una transacción actualmente, cree una nueva transacción.

⑤ PROPAGATION_NOT_SUPPORTED: Realiza operaciones de forma no transaccional, si hay una transacción actual, suspende la transacción actual.

⑥ PROPAGATION_NEVER: se ejecuta de forma no transaccional, si hay una transacción actual, se lanza una excepción.

⑦ PROPAGATION_NESTED: si hay una transacción actual, se ejecutará en una transacción anidada. Si no hay ninguna transacción actualmente, ejecútela de acuerdo con el atributo REQUIRED.

¿Hablar sobre el aislamiento de transacciones de primavera?

Spring tiene cinco niveles de aislamiento, el valor predeterminado es ISOLATION_DEFAULT (usando la configuración de la base de datos) y los otros cuatro niveles de aislamiento son consistentes con el nivel de aislamiento de la base de datos:

\ 1. ISOLATION_DEFAULT: use la base de datos subyacente para establecer el nivel de aislamiento, y usaré lo que esté configurado en la base de datos;

\ 2. ISOLATION_READ_UNCOMMITTED: lectura no confirmada, el nivel de aislamiento más bajo, antes de que se confirme la transacción, otras transacciones pueden leerla (se producirán lecturas fantasma, lecturas sucias, lecturas no repetibles); 3. ISOLATION_READ_COMMITTED: lectura confirmada, después de un la transacción confirmada puede ser leída por otras transacciones (provocará lecturas fantasmas, lecturas no repetibles), el nivel predeterminado del servidor SQL;

\ 4. ISOLATION_REPEATABLE_READ: lectura repetible, para garantizar que cuando los mismos datos se leen varias veces, su valor sea consistente con el contenido al comienzo de la transacción, y está prohibido leer datos que no hayan sido enviados por otras transacciones ( causará lectura fantasma), MySQL es el nivel predeterminado de

\ 5. ISOLATION_SERIALIZABLE: Serialización, el nivel de aislamiento más caro y confiable, que puede evitar lecturas sucias, lecturas no repetibles y lecturas fantasma.

Lectura sucia: indica que una transacción puede leer datos no confirmados en otra transacción. Por ejemplo, una transacción intenta insertar el registro A, y la transacción no se ha confirmado en este momento, y luego otra transacción intenta leer el registro A.

Lectura no repetible: se refiere a leer los mismos datos varias veces dentro de una transacción.

Lectura fantasma: se refiere al hecho de que los conjuntos de resultados devueltos por múltiples consultas dentro de la misma transacción son diferentes. Por ejemplo, la misma transacción A tiene n registros en la primera consulta, pero hay n + 1 registros en la segunda consulta en las mismas condiciones, lo que parece ser una ilusión. El motivo de la lectura fantasma es que otra transacción agrega, elimina o modifica los datos en el conjunto de resultados de la primera transacción. Si se modifica el contenido de los datos del mismo registro, los registros de todas las filas de datos se volverán más o menos.

¿Cuáles son las ventajas de la gestión de transacciones en el marco Spring?

  • Proporciona un modelo de programación inmutable para diferentes API de transacciones como JTA, JDBC, Hibernate, JPA y JDO.
  • Proporciona un conjunto de API simples para la gestión de transacciones programáticas en lugar de algunas API de transacciones complejas y admite la gestión de transacciones declarativas.
  • Está bien integrado con las diversas capas de abstracción de acceso a datos de Spring.

¿Qué tipo de gestión de transacciones prefieres?

La mayoría de los usuarios del marco Spring eligen la gestión de transacciones declarativas porque tiene el menor impacto en el código de la aplicación y, por lo tanto, está más en línea con la idea de un contenedor liviano no intrusivo. La gestión de transacciones declarativas es mejor que la gestión de transacciones programáticas, aunque es un poco menos flexible que la gestión de transacciones programáticas (que le permite controlar las transacciones mediante código). El único inconveniente es que la granularidad más fina solo se puede aplicar al nivel del método y no se puede aplicar al nivel del bloque de código como las transacciones programáticas.

Programación orientada a aspectos (AOP) de Spring (13) ¿Qué es AOP?

La programación orientada a objetos OOP (Programación orientada a objetos) permite a los desarrolladores definir relaciones verticales, pero no es adecuada para definir relaciones horizontales, lo que genera una gran duplicación de código, lo que no favorece la reutilización de varios módulos.

AOP (Programación Orientada a Aspectos), comúnmente conocida como programación orientada a aspectos, como complemento de la orientada a objetos, se utiliza para extraer y encapsular comportamientos y lógica públicos que no tienen nada que ver con los negocios pero que afectan a múltiples objetos en uno Un módulo reutilizable Este módulo se denomina "Aspecto", lo que reduce la duplicación de código en el sistema, reduce el acoplamiento entre módulos y mejora la capacidad de mantenimiento del sistema. Se puede utilizar para autenticación de autoridad, registro, procesamiento de transacciones, etc.

¿Cuál es la diferencia entre Spring AOP y AspectJ AOP? ¿Cuáles son las implementaciones de AOP?

La clave para la implementación de AOP radica en el modo proxy. El proxy AOP se divide principalmente en proxy estático y proxy dinámico. El proxy estático está representado por AspectJ; el proxy dinámico está representado por Spring AOP.

(1) AspectJ es una mejora del proxy estático. El llamado proxy estático significa que el marco AOP generará clases de proxy AOP durante la fase de compilación, por lo que también se denomina mejora en tiempo de compilación. Entrelazará AspectJ (aspecto) en Bytes de Java durante la fase de compilación. En el código, es el objeto AOP mejorado cuando se está ejecutando.

(2) El proxy dinámico utilizado por Spring AOP. El llamado proxy dinámico significa que el marco AOP no modificará el código de bytes, sino que generará temporalmente un objeto AOP para el método en la memoria cada vez que se ejecute. Este AOP

El objeto contiene todos los métodos del objeto de destino, se ha mejorado en un punto de corte específico y se vuelve a llamar al método del objeto original.

La diferencia entre el proxy dinámico JDK y el proxy dinámico CGLIB

Hay dos formas principales de proxy dinámico en Spring AOP, proxy dinámico JDK y proxy dinámico CGLIB:

  • Los servidores proxy dinámicos JDK solo proporcionan servidores proxy para interfaces y no admiten servidores proxy para clases. InvocationHandler, la interfaz principal de InvocationHandler y la clase Proxy, llama al código en la clase de destino a través del reflejo del método invoke() y entreteje dinámicamente la lógica transversal y el negocio; luego, Proxy usa InvocationHandler para crear dinámicamente una instancia que se ajuste a una determinada interfaz, genera un objeto proxy de la clase de destino.
  • Si la clase de proxy no implementa la interfaz InvocationHandler, entonces Spring AOP elegirá usar CGLIB para representar dinámicamente la clase de destino. CGLIB (Biblioteca de generación de código) es una biblioteca de clases para la generación de código, que puede generar dinámicamente un objeto de subclase de una clase específica en tiempo de ejecución, anular métodos específicos y agregar códigos mejorados para lograr AOP. CGLIB es un proxy dinámico mediante herencia, por lo que si una clase está marcada como final, no puede usar CGLIB como proxy dinámico.

La diferencia entre el proxy estático y el proxy dinámico es que el tiempo para generar objetos proxy AOP es diferente. En términos relativos, el método de proxy estático de AspectJ tiene un mejor rendimiento, pero AspectJ requiere un compilador específico para su procesamiento, mientras que

Spring AOP no requiere un procesamiento de compilador específico.

InvocationHandler y invocar (Proxy de objeto, método de método, argumentos de objeto []):

proxy es la instancia de proxy final generada; método es un método específico de la instancia de destino del proxy; args es el parámetro de entrada específico de un método de la instancia de destino del proxy, que se utiliza cuando se llama a la reflexión del método.

¿Cómo entender los proxies en Spring?

Los objetos creados después de aplicar consejos a un objeto de destino se denominan proxies. En el caso de objetos de cliente, el objeto de destino y el objeto proxy son los mismos.

Consejo + Objeto objetivo = Proxy

Explica algunos sustantivos en Spring AOP

(1) Aspecto: el aspecto es una combinación de consejo y punto de referencia. Los consejos y los puntos de referencia juntos definen el contenido general de un aspecto. En Spring AOP, los aspectos se pueden implementar usando clases genéricas (estilo basado en patrones) o en clases regulares anotadas con @AspectJ.

(2) Punto de unión: se refiere al método. En Spring AOP, un punto de unión siempre representa la ejecución de un método. Las aplicaciones pueden tener miles de notificaciones de aplicaciones ocasionales. Estas oportunidades se denominan puntos de unión. Un punto de unión es un punto durante la ejecución de la aplicación en el que se puede insertar un aspecto. Este punto podría ser cuando se llama a un método, cuando se lanza una excepción o incluso cuando se modifica un campo. El código de aspecto puede utilizar estos puntos para insertarlos en el flujo normal de la aplicación y agregar un nuevo comportamiento.

(3) Consejo (Consejo): En la terminología de AOP, el trabajo de aspecto se llama consejo.

(4) Pointcut: La definición de pointcut coincide con uno o más puntos de unión en los que se entrelazará el consejo. Por lo general, especificamos estos puntos de corte usando nombres explícitos de clases y métodos, o usando expresiones regulares para definir los nombres de clases y métodos que deben coincidir.

(5) Introducción: La introducción nos permite agregar nuevos métodos o propiedades a las clases existentes.

(6) Objeto objetivo: notificado por uno o más aspectos

(aconsejo) objeto. Suele ser un objeto proxy. También se llama ser notificado.

Objeto (aconsejado). Dado que Spring AOP se implementa a través de servidores proxy en tiempo de ejecución, este objeto siempre es un objeto proxy.

(7) Tejido: Tejido es el proceso de aplicar aspectos a objetos de destino y crear nuevos objetos proxy. Cuántos puntos en el ciclo de vida del objeto objetivo se pueden tejer:

  • Tiempo de compilación: los aspectos se entrelazan cuando se compila la clase de destino. El compilador de tejido de AspectJ teje aspectos de esta manera.
  • Período de carga de clases: el aspecto se teje cuando la clase de destino se carga en la JVM. Se requieren cargadores de clases especiales, que mejoran el código de bytes de una clase de destino antes de incorporarla a la aplicación. El tejido en tiempo de carga de AspectJ5 admite aspectos de tejido de esta manera.
  • Tiempo de ejecución: los aspectos se entrelazan en algún momento durante la ejecución de la aplicación. Generalmente, al tejer un aspecto, el contenedor AOP creará dinámicamente un objeto proxy para el objeto de destino. Spring AOP teje aspectos de esta manera.

Spring notifica objetos en tiempo de ejecución

Al envolver aspectos en clases proxy, Spring entrelaza aspectos en beans administrados por Spring en tiempo de ejecución.

medio. El proxy encapsula la clase de destino, intercepta las llamadas de los métodos recomendados y reenvía las llamadas al bean de destino real. Cuando el proxy intercepta una llamada a un método, la lógica de aspecto se ejecuta antes de llamar al método del bean objetivo.

Spring no crea el objeto proxy hasta que la aplicación necesita el bean proxy. Si estas usando

Para ApplicationContext, Spring creará objetos proxy cuando ApplicationContext cargue todos los beans de BeanFactory. Debido a que el objeto proxy se crea en tiempo de ejecución, no necesitamos un compilador especial para tejer los aspectos de Spring AOP.

Spring solo admite puntos de unión a nivel de método

Debido a que Spring se basa en proxies dinámicos, Spring solo admite puntos de unión de métodos. La falta de campos de Spring puede complementarse con Aspect.

admite puntos de unión y no admite puntos de unión del constructor. La función de interceptación del punto de conexión fuera del método, ¿cuál es la diferencia entre preocupación y preocupación transversal en Spring AOP? La diferencia entre preocupación y preocupación transversal en primavera aop

Una preocupación es el comportamiento de un módulo en una aplicación y una preocupación puede definirse como una función que queremos lograr.

Una preocupación transversal es una preocupación que utiliza toda la aplicación y afecta a toda la aplicación, como el registro, la seguridad y la transferencia de datos, funciones que requieren casi todos los módulos de la aplicación. Se trata, pues, de preocupaciones transversales.

¿Cuáles son los tipos de consejos de primavera?

En la terminología de AOP, el trabajo de un aspecto se denomina asesoramiento y, en realidad, se transmite cuando se ejecuta el programa.

Fragmento de código activado por el marco Spring AOP.

En los aspectos primaverales se pueden aplicar 5 tipos de consejos:

\ 1. Notificación previa (antes): llame a la función de notificación antes de llamar al método de destino;

\ 2. Notificación posterior (después): llame a la notificación después de que se complete el método de destino y no le importe cuál sea el resultado del método en este momento;

\ 3. Notificación de devolución (después de la devolución): llame a la notificación después de que el método de destino se ejecute correctamente;

\ 4. Después del lanzamiento: llame a la notificación después de que el método de destino arroje una excepción;

\ 5. Alrededor de la notificación (Alrededor): la notificación envuelve el método notificado y ejecuta el comportamiento personalizado antes y después de que se llame al método notificado.

El mismo aspecto, el orden de ejecución de diferentes consejos:

① Secuencia de ejecución sin excepción:

alrededor antes del consejo antes del consejo objetivo método 执行 alrededor después del consejo después del consejo

después de regresar

② Secuencia de ejecución en caso de excepción: alrededor antes del consejo antes del consejo ejecución del método objetivo alrededor después del consejo después del consejo

afterThrowing: ocurrió una excepción java.lang.RuntimeException: ocurrió una excepción

¿Qué es un aspecto aspecto?

El aspecto se compone de recuento de puntos y consejos, y el aspecto es una combinación de consejos y puntos de corte. Incluye tanto la definición de la lógica transversal como la definición del punto de conexión. Spring AOP es el marco responsable de implementar el aspecto, que entrelaza la lógica transversal definida por el aspecto en el punto de conexión especificado por el aspecto.

El objetivo del trabajo de AOP es cómo mejorar el punto de conexión del objeto objetivo de tejido, lo que incluye dos tareas:

  • Cómo localizar un punto de unión específico mediante pointcut y consejos
  • Cómo escribir código de aspecto en consejos.

Se puede considerar simplemente que las clases anotadas con @Aspect son aspectos.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-LVHUYORZ-1692509211713) (06-Preguntas de la entrevista de primavera (última versión de 2020) -focus .assets/Notas de aspecto.png )]

Explicar la implementación de aspectos basados ​​en esquema XML.

En este caso, los aspectos se implementan mediante clases regulares y configuración basada en XML. Explicar la implementación de aspectos basados ​​en anotaciones.

En este caso (basado en la implementación de @AspectJ), el estilo de la declaración de aspecto involucrada es consistente con la clase java normal con anotación java5.

¿Cuántos tipos diferentes de proxies automatizados existen?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

El mismo aspecto, el orden de ejecución de diferentes consejos:

① Secuencia de ejecución sin excepción:

alrededor antes del consejo antes del consejo objetivo método 执行 alrededor después del consejo después del consejo

después de regresar

② Secuencia de ejecución en caso de excepción: alrededor antes del consejo antes del consejo ejecución del método objetivo alrededor después del consejo después del consejo

afterThrowing: ocurrió una excepción java.lang.RuntimeException: ocurrió una excepción

¿Qué es un aspecto aspecto?

El aspecto se compone de recuento de puntos y consejos, y el aspecto es una combinación de consejos y puntos de corte. Incluye tanto la definición de la lógica transversal como la definición del punto de conexión. Spring AOP es el marco responsable de implementar el aspecto, que entrelaza la lógica transversal definida por el aspecto en el punto de conexión especificado por el aspecto.

El objetivo del trabajo de AOP es cómo mejorar el punto de conexión del objeto objetivo de tejido, lo que incluye dos tareas:

  • Cómo localizar un punto de unión específico mediante pointcut y consejos
  • Cómo escribir código de aspecto en consejos.

Se puede considerar simplemente que las clases anotadas con @Aspect son aspectos.

[Transferencia de imagen de enlace externo...(img-LVHUYORZ-1692509211713)]

Explicar la implementación de aspectos basados ​​en esquema XML.

En este caso, los aspectos se implementan mediante clases regulares y configuración basada en XML. Explicar la implementación de aspectos basados ​​en anotaciones.

En este caso (basado en la implementación de @AspectJ), el estilo de la declaración de aspecto involucrada es consistente con la clase java normal con anotación java5.

¿Cuántos tipos diferentes de proxies automatizados existen?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Proxy automático de metadatos

Supongo que te gusta

Origin blog.csdn.net/leader_song/article/details/132391123
Recomendado
Clasificación