¿Sabes por qué Spring diseña los frijoles como singletons por defecto?

Aquellos que están familiarizados con el desarrollo de Spring saben que Spring proporciona cinco ámbitos: singleton, prototype, request, session y global session.

La siguiente figura es una captura de pantalla del documento oficial. Los amigos interesados ​​pueden entrar y ver la diferencia entre estos cinco tipos. Hoy presentaré los dos primeros de estos cinco, que también son el singleton y el prototipo del alcance del bean proporcionado originalmente por Spring.

El documento oficial de Spring presenta la siguiente imagen:

Para obtener más información, consulte la introducción del documento oficial, que es muy detallada:

https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html

La diferencia entre frijol singleton y frijol prototipo

Si un bean se declara como singleton, solo se crea una instancia de un bean en el contenedor Spring cuando se procesan varias solicitudes y las solicitudes posteriores comparten este objeto, y este objeto se almacenará en un mapa. Cuando hay una solicitud, primero verificará si está en la caché (mapa), si lo hace, use este objeto directamente, si no, instanciará un nuevo objeto, por lo que este es un singleton. Pero para un bean prototipo, se crea una instancia de un bean nuevo directamente cada vez que llega una solicitud, y no hay proceso de almacenamiento en caché y verificación desde la caché.

1. Análisis de dibujos

2. Análisis del código fuente

Al generar el bean, primero determine si el singleton o el prototipo es

Si es un singleton, primero intente obtenerlo del caché y no cree uno nuevo

En conclusión:

  1. Un bean singleton reutilizará el bean solo cuando se cree un nuevo bean por primera vez, por lo que los objetos no se crean con frecuencia.

  2. El frijol prototipo se creará de nuevo cada vez

Ventajas de los frijoles singleton

Dado que no se crean nuevos objetos cada vez, existen varias ventajas de rendimiento:

1. Reducir el consumo de instancias recién generadas

El consumo de instancias recién generadas incluye dos aspectos: primero, Spring generará instancias de bean a través de la reflexión o cglib. Todas estas son operaciones que consumen rendimiento. En segundo lugar, la asignación de memoria a objetos también implica algoritmos complejos.

2. Reducir la recolección de basura de jvm

Dado que no se genera una nueva instancia de bean para cada solicitud, naturalmente se reciclan menos objetos.

3. Los frijoles se pueden obtener rápidamente

Debido a que la operación singleton get bean, excepto la primera generación, se obtiene de la caché, es muy rápida.

Desventajas de los frijoles singleton

Una gran desventaja de un bean singleton es que no puede ser seguro para subprocesos. ! ! Dado que todas las solicitudes comparten una instancia de bean, si el bean es un bean con estado, puede haber problemas en escenarios de concurrencia, mientras que el bean prototipo no tendrá ese problema (pero hay excepciones, como ser dependiente de un bean singleton) , Porque se crea una nueva instancia para cada solicitud. Me estoy preparando para escribir un artículo sobre este aspecto. Los amigos interesados ​​pueden seguirme en el proceso de recopilación, y luego escribiré un artículo detallado.

para resumir

¿Por qué Spring diseña un bean como singleton por defecto?

Respuesta: ¡Para mejorar el rendimiento! ! ! Desde varios aspectos,

  1. Crea menos instancias

  2. Recolección de basura

  3. Caché de acceso rápido

¿Cuáles son las desventajas del singleton?

Si tiene estado, no es seguro para subprocesos en un entorno concurrente

 

Supongo que te gusta

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