Загрузка классов Java EE и Java SE
Разница между загрузкой классов Java EE и Java SE в Интернете заключается в том, что
В Java SE загрузчик классов делегирует загрузку классов своему родительскому загрузчику классов, а затем пытается загрузить сам класс
Однако в Java EE загрузчик классов сначала пытается загрузить сам класс, а затем делегировать загрузку классов этого класса его родительскому загрузчику классов.
Пожалуйста, подтвердите мое понимание.
Кроме того, почему он так разработан в Java EE (Любые преимущества, если его так держать).
Это ссылка, по которой я слышал это [http://www.youtube.com/watch?v=t8sQw3pGJzM]
2 ответа
Ладно,
Обычное приложение имеет 3 стандартных загрузчика классов:
- Bootstrap Classloader
- Расширения Classloader
- System-Classpath Classloader
Все идет нормально. Теперь это работает для одного приложения, работающего отдельно и бесплатно.
Но что происходит, когда вы говорите J2EE? У вас есть несколько приложений, работающих в одном и том же месте, поэтому вам нужно найти способ, чтобы они не сталкивались друг с другом. Вот где эти дополнительные загрузчики классов вступают в игру.
Подумайте об экземпляре сервера. Есть JBoss с двумя развернутыми EAR. Что произойдет, если между приложениями возникнут конфликтующие классы? Они в порядке с их собственным конкретным контекстом, но в целом они противоречивы.
Эти дополнительные загрузчики классов представлены прикладным способом, чтобы обеспечить изоляцию между ними. Загрузчики классов ниже System-Classpath Classloader распознают класс, только если он указан в файле манифеста для одного из его дочерних элементов.
В J2SE три основных загрузчика классов работают в отношениях "родитель-ребенок" на основе трех принципов:
- Делегирование: если класс не загружен (кеш), запрос делегируется его родителю. Это продолжается до вершины иерархии (загрузчик классов Bootstrap), которая загружает основные классы, связанные с J2SE (т.е.
Integer
,ArrayList
, среди других). Это то, на что вы ссылаетесь в своем вопросе: загрузчик классов делегирует загрузку до верха иерархии, затем каждый загрузчик классов пытается загрузить класс, если его родитель не может его найти, пока кто-то не загрузит его. В противном случае: ClassNotFound. - Видимость: классы, загруженные родительским загрузчиком классов, видны его дочерним элементам, а не наоборот.
- Уникальность: если родительский загрузчик классов загружает класс, потомки никогда не перезагрузят его.
В Java SE загрузчик классов делегирует загрузку классов своему родительскому загрузчику классов, а затем пытается загрузить сам класс.
Правда, из-за принципов, изложенных выше.
В J2EE нет определенной структуры загрузчика классов (у поставщика есть "поэтическая лицензия" для ее реализации), но они вроде следуют иерархии. В этом случае загрузчик классов System-classpath загружает основное приложение: сервер. Таким образом, серверные библиотеки (в частности, их классы) доступны для каждого приложения благодаря принципу видимости.
Внизу приложения имеют определенные структуры загрузчика классов, но в целом они являются разными потомками загрузчика классов System-classpath. Каждое приложение загружает свои связанные и определенные классы (как приложение, так и библиотеки).
Загрузка здесь не распространяется на родителей за пределами контекста приложения. Зачем? потому что, если бы загрузчик классов System-classpath загружал приложения как обычно, класс каждого приложения был бы видим для других из-за принципа видимости, полностью разрушая изоляцию между ними. Так:
Однако в Java EE загрузчик классов сначала пытается загрузить сам класс, а затем делегировать загрузку классов этого класса его родительскому загрузчику классов.
Это отчасти верно, но я бы предпочел ограничить это утверждение контекстом приложения и исключить связанные с Java классы, которые действительно загружаются загрузчиками классов верхнего уровня.
Короче говоря: это не простой процесс, но я бы не сказал, что J2EE обрабатывает загрузку классов в противоположную сторону от J2SE.
Я думаю, что стандарт загрузки классов Java EE поможет вам на вашем пути. Насколько я знаю, для стандартной Java нет обязательного способа загрузки классов. Однако для WebApps (WAR) указывается, что загрузка классов является родительской.