[primavera] ¿Cuáles son las diferencias entre los ámbitos de Spring Bean?

Prefacio

Los beans de Spring tienen 5 alcances: singleton, prototipo, solicitud, sesión y globalSession

¿Cuál es la diferencia entre los alcances de Spring Bean?

En Spring, puede establecer el alcance del bean en el atributo de alcance del elemento <bean> para determinar si el bean es una instancia única o varias instancias.

De forma predeterminada, Spring solo crea una instancia única para cada bean declarado en el contenedor IOC, y esta instancia se puede compartir en todo el contenedor IOC: todas las llamadas posteriores a getBean() y referencias de beans devolverán este bean único. Este alcance se llama singleton y es el alcance predeterminado del bean.

Categoría de alcance y descripción

  • singleton: solo hay una instancia de Bean en el contenedor SpringIOC y el Bean existe como una única instancia.
  • prototipo: se devolverá una nueva instancia cada vez que se llame a getBean()
  • Solicitud: se creará un nuevo Bean para cada solicitud HTTP. Este alcance solo se aplica al entorno WebApplicationContext.
  • sesión: la misma sesión HTTP comparte un Bean y diferentes sesiones HTTP usan diferentes Beans. Este alcance solo se aplica al entorno WebApplicationContext.

Breve descripción

Alcance del bean: puede especificar el alcance del bean a través del atributo de alcance del elemento.

  • singleton: valor predeterminado. Cuando se crea el contenedor IOC, se creará una instancia del bean, que es un singleton y obtendrá el mismo cada vez.
  • prototipo: prototipo. Cuando se crea el contenedor IOC, ya no se crea una instancia del bean. Se crea una instancia del bean cada vez que se llama al método getBean y cada vez que se llama al método getBean.
  • solicitud: crea una instancia de un bean para cada solicitud
  • sesión: comparte un bean dentro de una sesión

caso de prueba

Debido a que normalmente uso SPRING MVC para el desarrollo, es necesario comprender cómo llamar a estos ámbitos.

1. Definir clases de Java con diferentes alcances.

código java

@Component  
@Scope( "session")  
public class SessionObj {
    
      
  
}  
@Component  
@Scope( "request")  
public class RequestObj {
    
      
  
}  
@Component  
@Scope( "prototype")  
public class PrototypeObj {
    
      
  
}  
@Component  
@Scope( "singleton")  
public class SingletonObj {
    
      
  
}  

2. Inyectar en el controlador. Dado que el controlador es un singleton, el objeto debe tomarse directamente del contenedor implementando la interfaz ApplicationContextAware.

Entonces el controlador bajo prueba es:

código java

@Controller  
public class IndexController implements ApplicationContextAware {
    
      
  
    private RequestObj RequestObj;  
  
    private SessionObj SessionObj;  
  
    private PrototypeObj PrototypeObj;  
  
    private SingletonObj SingletonObj;  
  
    private ApplicationContext applicationContext;  
  
    @RequestMapping("/")  
    @ResponseBody  
    public String index() {
    
      
        print();  
        return "Welcome";  
    }  
  
    public void print() {
    
      
        System.out.println("first  time singleton is :" + getSingletonObj());  
        System.out.println("second time singleton is :" + getSingletonObj());  
  
        System.out.println("first  time prototype is :" + getPrototypeObj());  
        System.out.println("second time prototype is :" + getPrototypeObj());  
  
        System.out.println("first  time request is :" + getRequestObj());  
        System.out.println("second time request is :" + getRequestObj());  
  
        System.out.println("first  time session is :" + getSessionObj());  
        System.out.println("second time session is :" + getSessionObj());  
    }  
  
    @Override  
    public void setApplicationContext(ApplicationContext applicationContext)  
            throws BeansException {
    
      
        this.applicationContext = applicationContext;  
    }  
  
    public RequestObj getRequestObj() {
    
      
        return applicationContext.getBean(RequestObj.class);  
    }  
  
    public void setRequestObj(RequestObj requestObj) {
    
      
        RequestObj = requestObj;  
    }  
  
    public SessionObj getSessionObj() {
    
      
        return applicationContext.getBean(SessionObj.class);  
    }  
  
    public void setSessionObj(SessionObj sessionObj) {
    
      
        SessionObj = sessionObj;  
    }  
  
    public PrototypeObj getPrototypeObj() {
    
      
        return applicationContext.getBean(PrototypeObj.class);  
    }  
  
    public void setPrototypeObj(PrototypeObj prototypeObj) {
    
      
        PrototypeObj = prototypeObj;  
    }  
  
    public SingletonObj getSingletonObj() {
    
      
        return applicationContext.getBean(SingletonObj.class);  
    }  
  
    public void setSingletonObj(SingletonObj singletonObj) {
    
      
        SingletonObj = singletonObj;  
    }  
  
}  
 
 

3. Resultados de ejecución

código java

//使用chrome第一次打印数据:  
first  time singleton is :com.fb.po.SingletonObj@1e3223e  
second time singleton is :com.fb.po.SingletonObj@1e3223e  
first  time prototype is :com.fb.po.PrototypeObj@3e683f  
second time prototype is :com.fb.po.PrototypeObj@12e18d7  
first  time request is :com.fb.po.RequestObj@1d45706  
second time request is :com.fb.po.RequestObj@1d45706  
first  time session is :com.fb.po.SessionObj@9a6b2e  
second time session is :com.fb.po.SessionObj@9a6b2e  
  
  
  
//使用chrome打印第二次数据  
first  time singleton is :com.fb.po.SingletonObj@1e3223e  
second time singleton is :com.fb.po.SingletonObj@1e3223e  
first  time prototype is :com.fb.po.PrototypeObj@122e5be  
second time prototype is :com.fb.po.PrototypeObj@192add  
first  time request is :com.fb.po.RequestObj@4d1b6c  
second time request is :com.fb.po.RequestObj@4d1b6c  
first  time session is :com.fb.po.SessionObj@9a6b2e  
second time session is :com.fb.po.SessionObj@9a6b2e  
  
  
  
//使用IE打印第三次数据  
first  time singleton is :com.fb.po.SingletonObj@1e3223e  
second time singleton is :com.fb.po.SingletonObj@1e3223e  
first  time prototype is :com.fb.po.PrototypeObj@10f1ecb  
second time prototype is :com.fb.po.PrototypeObj@1aeb990  
first  time request is :com.fb.po.RequestObj@18a1e7  
second time request is :com.fb.po.RequestObj@18a1e7  
first  time session is :com.fb.po.SessionObj@12d5c55  
second time session is :com.fb.po.SessionObj@12d5c55  
 

4. Análisis de resultados

A juzgar por los resultados, los datos del bean singleton se imprimen igual tres veces (el nivel de bean predeterminado es singleton), los
datos del bean prototipo son diferentes cada vez y se llama dos veces para cada solicitud. Los resultados son todos diferente.
El bean de solicitud es inconsistente cada vez que se realiza una solicitud, pero los datos devueltos por la misma solicitud son consistentes.
Los resultados del bean de sesión son consistentes en las dos primeras veces, pero los datos son inconsistentes en la última vez, lo que es consistente con el ritmo de la sesión.

5. Falta

Se dice en Internet que se debe configurar
el código XML.

<listener>   
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>   
</listener>   

Pero funciona bien sin configuración... Tengo curiosidad...

El último alcance es adecuado para portlets, no lo he probado, se dice que se puede compartir entre múltiples sesiones y el efecto es equivalente a variables globales.

Supongo que te gusta

Origin blog.csdn.net/u011397981/article/details/132846812
Recomendado
Clasificación