¿El controlador de Spring es singleton o múltiples instancias? ¿Cuántas personas respondieron correctamente?

El controlador es singleton por defecto, no utilice variables miembro no estáticas, de lo contrario se producirá confusión en la lógica de datos. No es seguro para subprocesos debido al singleton.

Verifiquemos brevemente lo siguiente:

package com.riemann.springbootdemo.controller;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author riemann
 * @date 2019/07/29 22:56
 */
@Controller
public class ScopeTestController {

    private int num = 0;

    @RequestMapping("/testScope")
    public void testScope() {
        System.out.println(++num);
    }

    @RequestMapping("/testScope2")
    public void testScope2() {
        System.out.println(++num);
    }

}

Primero visitamos  http://localhost:8080/testScopey la respuesta fue sí 1; luego visitamos nuevamente http://localhost:8080/testScope2y la respuesta fue sí  2.

Obtenga diferentes valores, que no son seguros para subprocesos.

A continuación, controlleragreguemos más casos @Scope("prototype")

package com.riemann.springbootdemo.controller;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author riemann
 * @date 2019/07/29 22:56
 */
@Controller
@Scope("prototype")
public class ScopeTestController {

    private int num = 0;

    @RequestMapping("/testScope")
    public void testScope() {
        System.out.println(++num);
    }

    @RequestMapping("/testScope2")
    public void testScope2() {
        System.out.println(++num);
    }

}

Todavía visitamos primero  http://localhost:8080/testScope, y la respuesta fue sí 1; luego visitamos nuevamente http://localhost:8080/testScope2, y la respuesta fue tranquila  1.

Creo que no es difícil para todos encontrar:

Los singleton no son seguros y darán lugar al uso repetido de atributos.

solución

1. No defina variables miembro en el controlador. 2. En caso de que sea necesario definir una variable miembro no estática, establézcala en modo multi-caso a través de la anotación @Scope ("prototipo"). 3. Use variables ThreadLocal en Controller

Suplemento

El alcance del frijol de primavera tiene los siguientes 5:

1. singleton: modo singleton, cuando spring crea un contenedor applicationContext, spring querrá inicializar todas las instancias del alcance, más lazy-init para evitar el preprocesamiento;

2. Prototipo: modo prototipo, cada vez que se obtenga el bean a través de getBean, se generará una nueva instancia y Spring ya no la administrará después de la creación;

(Lo siguiente solo se usa en el proyecto web)

3.request: Todos los que se involucran en la web deben comprender el dominio de la solicitud, es decir, se genera una nueva instancia cada vez que se realiza una solicitud. La diferencia con el prototipo es que después de la creación, Spring sigue esperando la siguiente gestión;

4.sesión: cada sesión, igual que la anterior;

5. Sesión global: dominio web global, similar a la aplicación en servlet.

 

Supongo que te gusta

Origin blog.csdn.net/bjmsb/article/details/108501128
Recomendado
Clasificación