Mecanismo de aislamiento de la carga de clases de Tomcat
Para muchos desarrolladores de Java que no utilizan frameworks, los cargadores de clases rara vez se utilizan. Recientemente, leí dos excelentes publicaciones de blog y obtuve una comprensión profunda del mecanismo de carga de clases de classLoader y Tomcat (V), lo que me dio mucha inspiración y pensamiento.
Para los desarrolladores comunes, la función principal puede ejecutar un programa Java completo (de hecho, iniciar un proceso Java también utiliza el cargador de clases que viene con Java). Pero considerando un programa de tipo contenedor como Tomcat, las dos publicaciones de blog anteriores sobre
me dieron una sensación de iluminación que nunca había considerado tales necesidades y entornos, e hicieron que los desarrolladores de marcos realmente pensaran en ello. de. Entonces, ¡los desarrolladores del marco realmente pensaron mucho en ello!
Orden de carga de clases de Tomcat (activar el modo delegado)
En Tomcat, el comportamiento predeterminado es intentar primero escribir Bootstrap y Extension para cargar, si no, luego cargar en WebappClassLoader , Si aún no lo encuentra, busque en Común. En Alibaba, usamos Tomcat con el modo delegado habilitado, por lo que el tipo de carga tiene prioridad sobre el cargador de clases principal.
Esto también está documentado en el sitio web oficial
Tengo entendido que puede lograr un aislamiento mutuo utilizando dos cargadores de clases diferentes para la misma clase, pero tenga en cuenta que ambos padres delegan modo, no permita que el cargador de clases principal cargue la clase que desea cargar.
Esta clase tiene dos cargadores de clases y la clase classloader.Container se carga dos veces.
Esta clase es una clase contenedora, que se empaqueta en testContainer durante la última llamada de clase.
Salida final
Puede ver que la salida de los dos contenedores no es la misma y la operación addEntry en un contenedor no afectará al otro contenedor.
Lo anterior implementa la encapsulación de un contenedor simple.