Fig.1 tomcatChargeur de classe
Le processus de débogage utilise tous les paramètres par défaut,D'autres circonstances ne sont pas prises en considération pour le moment.
javaLe chargeur de classe suit le mécanisme de délégation parentale,Raisons:Cela permet de maintenir une priorité,GarantiejavaLes classes de base de ne pas être écrasées.
MaistomcatSur cette base,J'ai encore personnalisé mon chargeur de classe.Raisons:
1. DémarragetomcatElle a besoin de--Application ClassLoader;
2. tomcatDépendance supplémentaire nécessitant une personnalisation--Catalina ClassLoader(Ce que je comprends, c'est quetomcatLes fonctions sont personnalisées);
3. PourwebL'application charge quelques ressources publiques--Shared ClassLoader;
4. Pour CatalinaClassLoader Et Shared ClassLoader Charger les ressources publiques-- Common ClassLoader;
5. webApplication( C'est - à - dire qu'il est déployé wabapps Applications dans le Répertoire ) Un environnement dépendant est également nécessaire --WebAppClassLoader;
Copier le Code
Il y a quelques points à noter ici.
1. Sous paramètres par défaut ,Bien quetomcat Appelé dans le code source Thread.currentThread().setContextClassLoader(catalinaLoader); Maistomcat Le chargeur de classe réel lui - même est Application ClassLoader( Parce que par défaut ,CatalinaClassLoader Aucune ressource supplémentaire chargée , Donc, pour l'instant, );
Peut être vérifié par le code suivant :
Fig.2 Inweb Appel en application Thread.currentThread().getContextClassLoader().getParent().getParent().loadClass("org.apache.catalina.startup.Catalina")Partomcat Le mécanisme de chargement de classe de : Thread.currentThread().getContextClassLoader().getParent().getParent() Le chargeur de classe qui en résulte est Application ClassLoader
2. SpringbootIntégrétomcat Mécanisme de chargement de classe utilisé , Avec le déploiement webapps Différents mécanismes de chargement de classe sont utilisés dans le Répertoire ( Plus tard. )
3.ParallelWebappClassLoader Bien qu'il s'agisse d'un chargeur de classe personnalisé , Mais ça correspond. Java De la délégation parentale , Ou un mécanisme sélectif de délégation parentale
Copier le Code
Fig.3 ParallelWebappClassLoaderHéritéWebappClassLoaderBase
Fig.4 ParallelWebappClassLoaderHéritéWebappClassLoaderBase
Afin de vérifier que 3Point:
*IntomcatDans le code sourceCatalina.javaNouveauhi()Méthodes;
* En préparation web Ajouter le même chemin dans l'application Catalina.java
* En préparation web Appel de réflexion dans l'application Catalina.hi()Méthodes, Les résultats sont imprimés tomcat Résultat de l'appel de méthode dans le code source
Fig.5 Validation