La última colección de preguntas de la entrevista de JAVA (8)

Patrones de diseño

88. Hábleme de los patrones de diseño con los que está familiarizado.
Referencia: Enciclopedia de patrones de diseño

89. ¿Cuál es la diferencia entre una fábrica simple y una fábrica abstracta?

Modelo de fábrica simple:
este modelo en sí es muy simple y se usa en el caso de negocios más simples. Generalmente se usa para proyectos pequeños o cuando productos específicos rara vez se expanden (por lo que la clase de fábrica no necesita cambiarse con frecuencia).

Consta de tres roles:

  • Rol de la fábrica: Este es el núcleo de este modelo, que contiene cierta lógica de negocio y lógica de juicio. Según diferentes lógicas, se producen productos de fábrica específicos. Como la clase Driver en el ejemplo.

  • Rol de producto abstracto: generalmente es una clase principal heredada por un producto específico o una interfaz implementada. Realizado por interfaz o clase abstracta. Como la interfaz Car en el ejemplo.

  • Rol de producto específico: el objeto creado por la clase de fábrica es una instancia de este rol. Está implementado por una clase específica en java, como las clases Benz y Bmw en el ejemplo.

Usemos un diagrama de clases para mostrar claramente la relación entre ellos: el
Inserte la descripción de la imagen aquí
patrón de fábrica abstracto:

Primero entendamos qué es una familia de productos: una familia de productos que se ubican en diferentes estructuras jerárquicas de productos y tienen funciones relacionadas.
Inserte la descripción de la imagen aquí
BmwCar y BenzCar en la figura son dos árboles de productos (jerarquía de productos); y BenzSportsCar y BmwSportsCar, como se muestra en la figura, son una familia de productos. Todos se pueden colocar en la familia de autos deportivos, por lo que las funciones están relacionadas. Del mismo modo, BmwBussinessCar y BenzBusinessCar también son una familia de productos.

Se puede decir que la diferencia entre este y el patrón del método de fábrica radica en la complejidad del objeto que debe crearse. Y el patrón de fábrica abstracto es el más abstracto y general de los tres. El propósito del patrón de fábrica abstracto es proporcionar una interfaz para que el cliente cree objetos de productos en varias familias de productos.

Además, se deben cumplir las siguientes condiciones para utilizar el patrón de fábrica abstracto:

  1. Hay varias familias de productos en el sistema y el sistema solo puede consumir una familia de productos a la vez.

  2. Se utilizan productos que pertenecen a la misma familia de productos.

Echemos un vistazo a los diversos roles del patrón de fábrica abstracto (el mismo que el método de fábrica):

  • Función de fábrica abstracta: este es el núcleo del patrón del método de fábrica, no tiene nada que ver con la aplicación. Es la interfaz que debe implementar el rol de fábrica específico o la clase principal que debe heredarse. Se implementa mediante clases abstractas o interfaces en java.

  • Rol específico de la fábrica: contiene código relacionado con la lógica empresarial específica. Llamado por la aplicación para crear el objeto correspondiente del producto específico. En java se implementa mediante clases concretas.

  • Rol de producto abstracto: es la clase padre heredada por el producto concreto o la interfaz implementada. Generalmente, hay clases abstractas o interfaces para implementar en java.

  • Rol de producto específico: el objeto creado por un rol de fábrica específico es una instancia de este rol. Se realiza mediante clases concretas en java.


Primavera / Primavera MVC

90. ¿Por qué usar resorte?

1. Introducción

  • Propósito: resolver la complejidad del desarrollo de aplicaciones empresariales

  • Función: utilice JavaBean básico en lugar de EJB y proporcione más funciones de aplicación empresarial

  • Alcance: cualquier aplicación Java

En pocas palabras, Spring es un marco de contenedor ligero de inversión de control (IoC) y orientado a aspectos (AOP).

2. Ligero

El resorte es liviano en términos de tamaño y gastos generales. El marco completo de Spring se puede publicar en un archivo JAR de solo 1 MB de tamaño. Y la sobrecarga de procesamiento requerida por Spring también es insignificante. Además, Spring no es intrusivo: por lo general, los objetos en las aplicaciones de Spring no dependen de las clases específicas de Spring.

3. Inversión de control

Spring promueve el acoplamiento suelto a través de una técnica llamada Inversión de control (IoC). Cuando se aplica IoC, otros objetos de los que depende un objeto se pasarán de forma pasiva, en lugar de crear o encontrar objetos dependientes por el propio objeto. Puede pensar en IoC como lo opuesto a JNDI; no es que el objeto encuentre dependencias del contenedor, sino que el contenedor le pasa activamente las dependencias cuando el objeto se inicializa sin esperar la solicitud del objeto.

4. Enfréntate al aspecto

Spring proporciona un amplio soporte para la programación orientada a aspectos, lo que permite un desarrollo cohesivo al separar la lógica empresarial de la aplicación y los servicios a nivel del sistema (como la auditoría y la gestión de transacciones). Los objetos de aplicación solo implementan lo que se supone que deben hacer: lógica de negocios completa, nada más. No son responsables (ni siquiera conscientes de) otras preocupaciones a nivel del sistema, como el registro o el soporte de transacciones.

5. Contenedor

Spring contiene y administra la configuración y el ciclo de vida de los objetos de la aplicación. En este sentido, es un contenedor. Puedes configurar cómo se crea cada bean basado en un prototipo configurable (prototipo), tu bean puede crear una instancia individual o generar una nueva instancia cada vez que la necesite, y cómo se relacionan entre sí. Sin embargo, Spring no debe confundirse con los contenedores EJB tradicionales de peso pesado, ya que a menudo son voluminosos y difíciles de usar.

6 marco

Spring puede configurar y combinar componentes simples en aplicaciones complejas. En Spring, los objetos de la aplicación se combinan de forma declarativa, normalmente en un archivo XML. Spring también proporciona muchas funciones básicas (gestión de transacciones, integración del marco de persistencia, etc.), dejándote el desarrollo de la lógica de la aplicación.

-
Estas características incluyen todo el Spring para que pueda escribir código más limpio, más manejable y más fácil de probar. También brindan soporte básico para varios módulos en Spring.

91. Explique qué es aop.

Se puede decir que AOP (Programación Orientada a Aspectos, programación orientada a aspectos) es el complemento y mejora de OOP (Programación Orientada a Objetos, programación orientada a objetos). OOP introduce conceptos como encapsulación, herencia y polimorfismo para establecer una jerarquía de objetos para simular una colección de comportamientos públicos. Cuando necesitamos introducir comportamientos públicos para objetos dispersos, OOP es impotente. En otras palabras, OOP le permite definir una relación de arriba a abajo, pero no es adecuado para definir una relación de izquierda a derecha. Por ejemplo, la función de registro. El código de registro a menudo se distribuye horizontalmente en todos los niveles de objetos y no tiene nada que ver con las funciones básicas de los objetos a los que se distribuye. Lo mismo ocurre con otros tipos de código, como la seguridad, el manejo de excepciones y la persistencia transparente. Este tipo de código irrelevante esparcido por todas partes se denomina código transversal y, en el diseño de programación orientada a objetos, conduce a una gran cantidad de duplicación de código, lo que no favorece la reutilización de varios módulos.

La tecnología AOP es todo lo contrario. Utiliza una tecnología llamada "transversal" para diseccionar el interior del objeto encapsulado y encapsular esos comportamientos comunes que afectan a múltiples clases en un módulo reutilizable, y asígnele un nombre. Para "Aspecto", es decir, aspecto. El llamado "aspecto", en pocas palabras, consiste en encapsular la lógica o responsabilidades que no están relacionadas con el negocio, sino que son llamadas por los módulos de negocio, lo cual es conveniente para reducir el código repetitivo del sistema, reduciendo el acoplamiento entre módulos, y es propicio para el desarrollo futuro Operabilidad y mantenibilidad. AOP representa una relación horizontal. Si el "objeto" es un cilindro hueco, que encapsula las propiedades y comportamientos del objeto, entonces el método de programación orientada a aspectos es como un borde afilado para dividir estos cilindros huecos. Abrir para recibir las noticias adentro. La sección de corte es el llamado "aspecto". Luego restauró estos planos cortados con ingeniosa habilidad, sin dejar rastros.

Usando tecnología "transversal", AOP divide el sistema de software en dos partes: preocupaciones centrales y preocupaciones transversales. El proceso principal de procesamiento empresarial es la preocupación central y la parte menos relevante es la preocupación transversal. Una característica de las preocupaciones transversales es que a menudo ocurren en múltiples lugares de la preocupación central y son básicamente similares en todas partes. Como autenticación de autoridad, registro, procesamiento de transacciones. El papel de Aop es separar las diversas preocupaciones en el sistema y separar las preocupaciones centrales de las preocupaciones transversales. Como dijo Adam Magee, arquitecto senior de soluciones de Avanade, la idea central de AOP es "separar la lógica empresarial en la aplicación de los servicios generales que la soportan.

92. Explique qué es ioc.

IOC es la abreviatura de Inversión de control, y la mayoría de los libros se traducen a "Inversión de control".

En 1996, Michael Mattson propuso por primera vez el concepto de COI en un artículo sobre la discusión de marcos orientados a objetos. Para las ideas básicas del diseño y la programación orientados a objetos, ya hemos hablado mucho antes, y no las repetiremos. En términos simples, es descomponer un sistema complejo en objetos que cooperan mutuamente. Después de encapsular estas clases de objetos, el La implementación interna es transparente para el exterior. De esta manera, se reduce la complejidad de la solución del problema y se puede reutilizar y ampliar de forma flexible.

El punto de vista propuesto por la teoría del COI es aproximadamente el siguiente: el desacoplamiento entre objetos dependientes se logra mediante un "tercero". Como se muestra en la siguiente figura: Como
Inserte la descripción de la imagen aquí
puede ver, debido a la introducción del "tercero" en la posición media, es decir, el contenedor IOC, los cuatro objetos de A, B, C y D no tienen relación de acoplamiento . La transmisión entre engranajes depende del "tercero". "Tres partes", el control de todos los objetos se transfiere al contenedor IOC "tercero". Por lo tanto, el contenedor IOC se ha convertido en el núcleo clave de todo el sistema . Los objetos están pegados para jugar un papel. Si no hay tal "adhesivo", el objeto y el objeto perderán contacto entre sí. Es por eso que algunas personas comparan el contenedor IOC con el "adhesivo".

Hagamos otro experimento: retire el contenedor IOC en el medio de la imagen de arriba, y luego eche un vistazo a este sistema:
Inserte la descripción de la imagen aquí
la imagen que vemos ahora es todo el contenido que necesitamos completar para realizar el sistema completo. En este momento, los cuatro objetos de A, B, C y D ya no están acoplados y no tienen conexión entre sí. En este caso, cuando está implementando A, no necesita pensar en B, C, y más D. Las dependencias entre objetos se han reducido al mínimo. Por lo tanto, si se puede implementar el contenedor IOC, será algo maravilloso para el desarrollo del sistema.Cada miembro que participa en el desarrollo solo necesita implementar su propia clase, ¡y no tiene nada que ver con los demás!

Echemos un vistazo de nuevo, ¿por qué la Inversión de control (IOC) tiene ese nombre? Comparemos:

Antes de que el sistema de software introduzca el contenedor IOC, como se muestra en la Figura 1, el objeto A depende del objeto B. Cuando el objeto A se inicializa o se ejecuta hasta cierto punto, debe crear activamente el objeto B o usar el objeto creado B. Ya sea que esté creando o usando el Objeto B, usted tiene control sobre él.

Después de que el sistema de software introduce el contenedor IOC, esta situación ha cambiado por completo. Como se muestra en la Figura 3, debido a la adición del contenedor IOC, la conexión directa entre el objeto A y el objeto B se pierde. Por lo tanto, cuando el objeto A se ejecuta para necesitar objeto B En ese momento, el contenedor IOC creará activamente un objeto B y lo inyectará en el lugar donde el objeto A lo necesita.

A través de la comparación antes y después, no es difícil ver: el proceso del objeto A obteniendo el objeto dependiente B ha cambiado de comportamiento activo a comportamiento pasivo, y se invierte el derecho de control. Este es el origen del nombre "inversión de control".

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

El marco de Spring ha integrado más de 20 módulos hasta ahora. Estos módulos se dividen principalmente en el contenedor principal, acceso / integración de datos, Web, AOP (Programación Orientada a Aspectos), herramientas, mensajes y módulos de prueba como se muestra en la siguiente figura.
Inserte la descripción de la imagen aquí
94. ¿Cuáles son los métodos de inyección más utilizados para primavera?

Spring implementa IOC (Inversión de control) a través de DI (Inyección de dependencia). Existen principalmente tres métodos de inyección de uso común:

  • Inyección de constructor

  • inyección de setter

  • Inyección basada en anotaciones

95. ¿Los frijoles en primavera son seguros para el hilo?

Ya sea que el contenedor Bean in the Spring sea seguro para subprocesos o no, el contenedor en sí no proporciona una estrategia de seguridad para el Bean. Por lo tanto, se puede decir que el contenedor Bean in the Spring no tiene características seguras para subprocesos, pero se debe estudiar el alcance específico del Bean.

96. ¿Qué alcance de frijoles admite Spring?

Cuando se crea una instancia de Bean a través del contenedor Spring, no solo se puede completar la instanciación de la instancia de Bean, sino que también se puede especificar un alcance específico para el Bean. Spring admite los siguientes cinco ámbitos:

  • singleton: modo singleton, en todo el contenedor Spring IoC, solo habrá una instancia del Bean definida usando singleton

  • Prototipo: modo prototipo, cada vez que se obtenga el Bean definido por prototipo mediante el método getBean del contenedor, se generará una nueva instancia de Bean

  • solicitud: para cada solicitud HTTP, un Bean definido por solicitud generará una nueva instancia, es decir, se generará una instancia de Bean diferente para cada solicitud HTTP. Este alcance es válido solo cuando se usa Spring en una aplicación web

  • sesión: Para cada
    sesión HTTP , se genera una nueva instancia utilizando la leche de frijoles definida por la sesión. El mismo alcance es válido solo cuando se usa Spring en una aplicación web

  • globalsession: para cada
    sesión HTTP global , se generará una nueva instancia utilizando el Bean definido por la sesión. Normalmente, solo funciona cuando
    se utiliza el contexto de portlet . El mismo alcance es válido solo cuando se usa Spring en una aplicación web

Entre ellos, los dos ámbitos de singleton y prototype son los más utilizados. Para un bean de ámbito único, cada vez que solicite el bean, obtendrá la misma instancia. El contenedor es responsable de rastrear el estado de la instancia de Bean y es responsable de mantener el comportamiento del ciclo de vida de la instancia de Bean; si se establece un Bean en el alcance del prototipo, cada vez que el programa solicita el bean con ese id, Spring cree una nueva instancia de Bean y luego devuélvala al programa. En este caso, el contenedor Spring solo usa la palabra clave new para crear una instancia de Bean. Una vez que la creación es exitosa, el contenedor no rastreará la instancia ni mantendrá el estado de la instancia de Bean.

Si no especifica el alcance del Bean, Spring usa el alcance singleton por defecto. Cuando Java crea una instancia de Java, necesita solicitar memoria; cuando la destruye, necesita completar la recolección de basura. Todas estas tareas llevarán a un aumento en la sobrecarga del sistema. Por lo tanto, la creación y destrucción de beans de alcance prototipo son relativamente costosas. Una vez que se crea correctamente una instancia de Bean de ámbito único, se puede reutilizar. Por lo tanto, a menos que sea necesario, intente evitar configurar el Bean en el alcance del prototipo.

97. ¿Cuáles son las formas de ensamblar frijoles automáticamente en primavera?

El contenedor Spring se encarga de crear beans en la aplicación y al mismo tiempo coordinar la relación entre estos objetos a través de ID. Como desarrolladores, necesitamos decirle a Spring qué beans crear y cómo ensamblarlos.

Hay dos formas de ensamblar los frijoles en primavera:

  • Mecanismo implícito de descubrimiento de beans y ensamblaje automático

  • Mostrar configuración en código java o XML

Por supuesto, estos métodos también se pueden utilizar en conjunto.

98. ¿Cuáles son los métodos de implementación de la transacción de primavera?

  1. La gestión programática de transacciones es la única opción para las aplicaciones basadas en POJO. Necesitamos llamar a beginTransaction (), commit (), rollback () y otros métodos relacionados con la gestión de transacciones en el código. Esta es la gestión de transacciones mediante programación.

  2. Gestión declarativa de transacciones basada en TransactionProxyFactoryBean

  3. Gestión declarativa de transacciones basada en @Transactional

  4. Configurar transacciones basadas en Aspectj AOP

99. Cuénteme sobre el aislamiento de transacciones de Spring.

El nivel de aislamiento de transacciones se refiere al grado de aislamiento entre la modificación de datos por una transacción y otra transacción paralela. Cuando múltiples transacciones acceden a los mismos datos al mismo tiempo, si no se adopta el mecanismo de aislamiento necesario, pueden ocurrir los siguientes problemas:

  • Lectura sucia: una transacción lee los datos de actualización no confirmados de otra transacción.

  • Lectura fantasma: Por ejemplo, la primera transacción modifica los datos en una tabla, por ejemplo, esta modificación involucra "todas las filas de datos" en la tabla. Al mismo tiempo, la segunda transacción también modifica los datos de esta tabla. Esta modificación es para insertar "una nueva fila de datos" en la tabla. Entonces, el usuario que opere la primera transacción en el futuro encontrará que todavía hay filas de datos sin modificar en la tabla, como si hubiera ocurrido una ilusión.

  • Lectura no repetible: Por ejemplo, dos sentencias select idénticas se ejecutan una tras otra en la misma transacción. Durante esta transacción, no se ha ejecutado ninguna sentencia DDL, pero los resultados obtenidos sucesivamente son inconsistentes, lo que es una lectura no repetible.

100. Cuénteme sobre el proceso de ejecución de Spring MVC.

Diagrama de flujo de operación de Spring MVC:
Inserte la descripción de la imagen aquí
Descripción del proceso de operación de Spring:

  1. El usuario envía una solicitud al servidor, y la solicitud es capturada por el control de front-end de Spring Servelt DispatcherServlet;

  2. DispatcherServlet analiza la URL de la solicitud para obtener el identificador de recurso solicitado (URI). Luego, de acuerdo con el URI, llame a HandlerMapping para obtener todos los objetos relacionados (incluido el objeto Handler y el interceptor correspondiente al objeto Handler) de la configuración Handler, y finalmente devuélvalo en forma de un objeto HandlerExecutionChain;

  3. DispatcherServlet selecciona un HandlerAdapter adecuado de acuerdo con el Handler obtenido; (Nota: Si el HandlerAdapter se obtiene con éxito, el método preHandler (...) del interceptor se ejecutará en este momento)

  4. Extraiga los datos del modelo en la solicitud, complete los parámetros de entrada del controlador y comience a ejecutar el controlador (controlador).
    En el proceso de completar los parámetros de entrada del controlador, de acuerdo con su configuración, Spring lo ayudará a hacer un trabajo adicional:

    一、HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
    
    二、数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
    
    三、数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
    
    四、数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
    
  5. Después de que se ejecuta el Handler, devuelve un objeto ModelAndView a DispatcherServlet;

  6. Según el ModelAndView devuelto, seleccione un ViewResolver adecuado (debe ser un ViewResolver registrado en el contenedor Spring) y devuélvalo a DispatcherServlet;

  7. ViewResolver combina Model y View para renderizar la vista;

  8. Devolver el resultado de la representación al cliente

101. ¿Cuáles son los componentes de Spring MVC?

Los componentes principales de Spring MVC:

  • DispatcherServlet: el controlador central, que reenvía la solicitud a una clase de control específica

  • Controlador: el controlador que procesa específicamente la solicitud

  • HandlerMapping: procesador de mapeo, responsable de mapear la estrategia de mapeo cuando el procesador central se reenvía al controlador

  • ModelAndView: la clase de paquete de los datos devueltos por la capa de servicio y la capa de vista

  • ViewResolver: Ver resolver, resolver vistas específicas

  • Interceptores: Interceptores, encargados de interceptar las solicitudes que definimos y luego procesar

102. ¿Cuál es la función de @RequestMapping?

RequestMapping es una anotación que se usa para procesar la asignación de direcciones de solicitud, que se puede usar en clases o métodos. Usado en clases, significa que todos los métodos de la clase que responden a solicitudes usan esta dirección como ruta principal.

La anotación RequestMapping tiene seis atributos. A continuación, la dividiremos en tres categorías para su descripción.

valor , método :

  • valor: Especifique la dirección real de la solicitud, la dirección especificada puede estar en modo Plantilla URI (se describirá más adelante);

  • método: especifique el tipo de método de la solicitud, GET, POST, PUT, DELETE, etc .;

consume , produce :

  • consume: especifique el tipo de contenido (Content-Type) para procesar la solicitud, como application / json, text / html;

  • produce: especifica el tipo de contenido devuelto y devuelve solo cuando el tipo (Aceptar) en el encabezado de la solicitud contiene el tipo especificado;

params, encabezados :

  • params: especifica que ciertos valores de parámetros deben incluirse en la solicitud antes de que se procese el método.

  • encabezados: la solicitud especificada debe contener ciertos valores de encabezado especificados para que el método procese la solicitud.

103. ¿Cuál es el rol de @Autowired?

"@ Detalles de uso con conexión automática": @ Uso con conexión automática

Supongo que te gusta

Origin blog.csdn.net/weixin_42120561/article/details/114931845
Recomendado
Clasificación