Publicación de actualización de preguntas de la entrevista Java (actualizada el 19 de abril de 2020)

1. primavera

1. Hable sobre el contenedor de COI y la inyección de dependencia DI en Spring

Respuesta: El contenedor IOC en Spring, es decir, inverso de la inversión de control, por ejemplo, antes de usar Spring, cuando usamos el objeto de capa dao en la capa de servicio, estamos acostumbrados a usar un nuevo objeto de capa dao. Este tipo de dependencia fuerte no se ajusta al principio de bajo acoplamiento y alta cohesión en Java . Para comprender el acoplamiento , introdujimos el patrón de fábrica. Originalmente, la forma en que obtuvimos los objetos era nueva, y ahora los objetos creados por la fábrica nos son proporcionados. Lo que resultó ser nuestra iniciativa ahora es pasiva. Esto se llama inversión de control. Esta fábrica es en realidad un Mapa, que llamamos un contenedor.

SpringIOC容器使用过程
//1.使用 ApplicationContext 接口,就是在获取 spring 容器
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据 bean 的 id 获取对象
IAccountService aService = (IAccountService) ac.getBean("accountService");
System.out.println(aService);
IAccountDao aDao = (IAccountDao) ac.getBean("accountDao");
System.out.println(aDao);

¿La diferencia entre BeanFactory y ApplicationContext?

BeanFactory es la interfaz de nivel superior en el contenedor Spring.
ApplicationContext es su subinterfaz.
El momento en que se crea el objeto es diferente.
ApplicationContext: en cuanto se lee el archivo de configuración, el objeto se crea de forma predeterminada.
BeanFactory: Qué usar cuando crear objetos.

Etiqueta de frijol en el COI?

Se usa para configurar los objetos que creará spring.
Por defecto, llama al constructor sin parámetros en la clase. Si no hay un constructor sin parámetros, no se puede crear con éxito.

id: proporciona un identificador único para el objeto en el contenedor. Se usa para obtener objetos.
clase: el nombre de clase completo de la clase especificada. Úselo para la reflexión para crear objetos. El constructor sin parámetros se llama por defecto.
alcance: especifique el alcance del objeto.
* singleton: el valor predeterminado, singleton.
* prototipo: casos múltiples.
* solicitud: en el proyecto WEB, Spring crea un objeto Bean y guarda el objeto en el campo de solicitud.
* sesión: proyecto WEB, Spring crea un Objeto Bean, almacene el objeto en el dominio de sesión.
* Sesión global: proyecto WEB, aplicado en el entorno de portlet. Si no hay entorno de portlet,
globalSession es equivalente a sesión.
Método de inicio: especifique el nombre del método de inicialización en la clase.
destroy-method: especifica el nombre del método de destrucción en la clase.

¿El alcance y el ciclo de vida del frijol?

Objeto Singleton: scope = "Singleton"
Una aplicación solo tiene una instancia del objeto. Su alcance es toda la referencia.
Ciclo de vida:
Objeto nacido: cuando se carga la aplicación y se crea el contenedor, se crea el objeto.
El sujeto está vivo: mientras el contenedor esté presente, el sujeto estará vivo.
Muerte del objeto: cuando se desinstala la aplicación y se destruye el contenedor, se destruye el objeto.
Múltiples instancias de objetos: alcance = "prototipo"
Cada vez que se accede a un objeto, se recrea una instancia de objeto.
Ciclo de vida:
nacimiento de objetos: al usar objetos, cree nuevas instancias de objetos.
El objeto está vivo: mientras el objeto esté en uso, permanecerá vivo.
Muerte del objeto: cuando el objeto no se utiliza durante mucho tiempo, el recolector de basura de Java lo recoge.

Inyección de dependencia DI en primavera

DI, inyección de dependencia。

Inyección de constructor

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
    <constructor-arg name="name" value=" 张三 "></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>

Establecer método de inyección, el más utilizado

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
    <property name="name" value="test"></property>
    <property name="age" value="21"></property>
    <property name="birthday" ref="now"></property>
</bean>
<bean id="now" class="java.util.Date"></bean>

p inyección de espacio de nombres, en realidad llame al método set inyección

2. Anotaciones en primavera

@Component: equivalente a <bean id = "" class = "">; Solo hay un valor de atributo en la anotación, que se utiliza para especificar el valor de id del bean; se derivan tres anotaciones para diferentes capas de la arquitectura de tres niveles, @Controller , @Service, @Repository.

@Autowired: inyección automática según el tipo. Cuando se usan anotaciones para inyectar propiedades, se puede omitir el método establecido. Solo puede inyectar otros tipos de frijoles. Cuando coincidan varios tipos, use el nombre de la variable del objeto que se va a inyectar como id del bean y búsquelo en el contenedor de muelles. Si se encuentra, también se puede inyectar con éxito. Informe un error si no puede encontrarlo.

@Qualifier: sobre la base de la inyección automática según el tipo, y luego de acuerdo con la identificación de la inyección de frijoles. No se puede usar de forma independiente cuando se inyectan campos, y se debe usar junto con @Autowire; pero se puede usar de forma independiente cuando se inyectan parámetros del método. La anotación tiene un valor de atributo: especifica el id del bean.

@Resource: Inyecte directamente de acuerdo con la identificación del bean. Solo se puede inyectar en otros tipos de frijoles. La anotación solo tiene un nombre de atributo: especifica el id del bean.

@Value: inyecta datos de tipo de datos básicos y de tipo de cadena, la anotación tiene un valor de atributo: se utiliza para especificar el valor.

@Scope: Equivalente a: <bean id = "" class = "" scope = "">, especifique el alcance del bean. La anotación solo tiene un valor de atributo: el valor del rango especificado. Valor: sesión de solicitud de prototipo singleton globalsession.

@Configuración: se utiliza para especificar que la clase actual es una clase de configuración de muelles, y las anotaciones se cargarán desde esta clase cuando se cree el contenedor. Debe usar AnnotationApplicationContext (clase con @Configuration annotation.class) para obtener el contenedor. Esta anotación tiene un valor de atributo: se utiliza para especificar el código de bytes de la clase de configuración.

@ComponentScan: se utiliza para especificar el paquete que se escaneará en primavera al inicializar el contenedor. La función es la misma que en el archivo de configuración Spring xml:
<contexto: component-scan base-package = "com.itheima" /> Escriba en la línea debajo de @Configuration, @ComponentScan ("com.itheima")

@Bean: esta anotación solo se puede escribir en el método, lo que indica que este método se utiliza para crear un objeto y ponerlo en el contenedor de resorte. nombre: asigne un nombre (es decir, ID de bean) al objeto creado por el método de anotación actual @Bean.

3. Hable sobre su comprensión de AOP en primavera

AOP: El nombre completo es Programación Orientada a Aspectos, a saber: programación orientada a aspectos. En pocas palabras, es extraer el código repetido de nuestro programa. Cuando sea necesario ejecutarlo, utilice la tecnología de proxy dinámico para mejorar nuestros métodos existentes sin modificar el código fuente.

Punto de conexión (JointPoint) : se refiere a todos los métodos en el proyecto, podemos agregar el código para escribir registros para cada método, por lo que cada candidato es un punto de conexión

Pointcut : Entonces no debemos agregar un registro para cada método, esos puntos de conexión que necesitan ser procesados se llaman puntos de corte.

Notificación (aviso) : el código para escribir registros se denomina notificación, lo que significa la parte del código que se mejora específicamente

Aspecto : punto de entrada + notificación = aspecto

<bean id="log" class="com.wanglei.utils.Logger"></bean>
<!--配置AOP-->
<aop:config>
        <!--配置切入点-->
        <aop:pointcut id="accountServicePoint" expression="execution(* com.wanglei.service.impl.*.*(..))"></aop:pointcut>
        <!--配置切面=通知+切入点-->
        <aop:aspect id="logAdvice" ref="log">
            <!--前置通知-->
            <aop:before method="printLog1" pointcut-ref="accountServicePoint"></aop:before>
            <!--后置通知-->
            <aop:after-returning method="printLog2" pointcut-ref="accountServicePoint"></aop:after-returning>
            <!--异常通知-->
            <aop:after-throwing method="printLog3" pointcut-ref="accountServicePoint"></aop:after-throwing>
            <!--最终通知-->
            <aop:after method="printLog4" pointcut-ref="accountServicePoint"></aop:after>

        </aop:aspect>
</aop:config>

二 、 SpringMVC

1. Flujo de procesamiento SpringMVC

(1) El cliente envía una solicitud al controlador front-end DispatcherServlet;
(2) Después de recibir la solicitud, DispatcherServlet llama al mapeador del procesador HandlerMapping para solicitar un
identificador ; (3) El mapeador del procesador encuentra un procesador específico de acuerdo con la url de solicitud y genera El objeto del procesador y el interceptor del procesador (generado si lo hay) se devuelven a DispatcherServlet;
(4) DispatcherServlet llama al adaptador de procesador HandlerAdapter ;
(5) HandlerAdapter llama al procesador específico (Handler, también llamado controlador back-end después de la adaptación) );
. (6) realizan completa Handler devuelve ModelAndView;
. (7) Handler HandlerAdapter es el resultado de la ejecución se devuelve al ModelAndView la DispatcherServlet;
. (8) a la DispatcherServlet ModelAndView pasar ViewResolver vista analizador análisis sintáctico;
. retorno después de la vista detallada (9) ViewResolver resuelto;
( 10) DispatcherServlet representa la vista en Vista (es decir, llena los datos del modelo en la vista)
(11) DispatcherServlet responde al usuario.

 

2. Enlace de parámetros de solicitud

Tipo de datos básico y cadena, requiere formato clave = valor en la ruta de solicitud

    <a href="param?info=wanglei">向后台传递wanglei</a>

    @RequestMapping(path = "/param")
    public String paramMethod(String info){
        System.out.println(info);
        return "success";
    }

El objeto POJO, el atributo de nombre en el formulario y el atributo en la clase de entidad de usuario deben ser los mismos antes de que se pueda inyectar a través del método establecido

    <form action="beanparam" method="post">
        用户名:<input name="username" type="text"><br>
        年&nbsp龄:<input name="userage" type="text"><br>
        账户名:<input name="account.accountname" type="text"><br>
        账户密码:<input name="account.accountpass" type="text"><br>
        <input type="submit" name="提交">
    </form>

    @RequestMapping(path = "/beanparam")
    public String parambeanMethod(User user){
        System.out.println(user);
        return "success";
    }

Parámetros de enlace de marcador de posición de ruta de solicitud: la ruta de solicitud debe estar en formato /delProducts.do/3

    //使用占位符,保证占位符和@PathVariable("ids")一样
    @RequestMapping("/delProducts.do/{ids}")
    @ResponseBody
    public String delProducts(@PathVariable("ids") String ids){
        if (ids.contains(",")){
            String[] split = ids.split(",");
            Integer id = Integer.valueOf(split[0]);
            productService.delProducts(id);
            System.out.println("================id"+id);
        }else {

        }

        return "删除ok";
    }

3. Los parámetros de la solicitud están confusos en chino

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

4.Galleta 和 Sesión

Tanto Cookie como Session pertenecen a la tecnología de sesión en javaweb. Sesión: una sesión es similar a una conversación en la vida. El papel de la tecnología de sesión es compartir datos en una sesión. Se divide en tecnología de sesión del lado del cliente (cookie) y tecnología de sesión del lado del servidor. (Sesión)

El protocolo HTTP es un protocolo sin estado. Una vez que se completa el intercambio de datos, se cerrará la conexión entre el cliente y el servidor, y se debe establecer una nueva conexión para intercambiar datos nuevamente. Esto significa que el servidor no puede rastrear la sesión desde la conexión.

Diferencia: las cookies se guardan en el navegador del cliente, mientras que la sesión se guarda en el servidor. El mecanismo de cookies es determinar la identidad del cliente verificando el "pasaporte" del cliente, luego el mecanismo de sesión es confirmar la identidad del cliente verificando la "lista de clientes" en el servidor. La sesión es equivalente a un archivo de cliente creado por el programa en el servidor. Cuando un cliente visita, solo necesita consultar la tabla de archivos del cliente.
 

5. Reenvío y redireccionamiento

Reenvío: es la transferencia de control dentro del servidor, que es solicitada por el área del servidor. El cliente no sabe cómo transferir, por lo que la dirección del navegador del cliente no mostrará la dirección redirigida. La barra de direcciones no cambiará.
Redirección: es el servidor que le dice al cliente a qué dirección redirigir. El cliente solicita la dirección redirigida por sí mismo, por lo que se muestra la dirección redirigida, y se puede entender que el navegador ha realizado al menos dos solicitudes de acceso. La barra de direcciones cambiará.

 

 

111 artículos originales publicados · Me gusta 60 · 70,000 + vistas

Supongo que te gusta

Origin blog.csdn.net/Haidaiya/article/details/105611801
Recomendado
Clasificación