Загрузка классов Java EE и Java SE

Разница между загрузкой классов Java EE и Java SE в Интернете заключается в том, что

В Java SE загрузчик классов делегирует загрузку классов своему родительскому загрузчику классов, а затем пытается загрузить сам класс

Однако в Java EE загрузчик классов сначала пытается загрузить сам класс, а затем делегировать загрузку классов этого класса его родительскому загрузчику классов.

Пожалуйста, подтвердите мое понимание.

Кроме того, почему он так разработан в Java EE (Любые преимущества, если его так держать).

Это ссылка, по которой я слышал это [http://www.youtube.com/watch?v=t8sQw3pGJzM]

2 ответа

Решение

Ладно,

Обычное приложение имеет 3 стандартных загрузчика классов:

  1. Bootstrap Classloader
  2. Расширения Classloader
  3. System-Classpath Classloader

Все идет нормально. Теперь это работает для одного приложения, работающего отдельно и бесплатно.

Но что происходит, когда вы говорите J2EE? У вас есть несколько приложений, работающих в одном и том же месте, поэтому вам нужно найти способ, чтобы они не сталкивались друг с другом. Вот где эти дополнительные загрузчики классов вступают в игру.

Подумайте об экземпляре сервера. Есть JBoss с двумя развернутыми EAR. Что произойдет, если между приложениями возникнут конфликтующие классы? Они в порядке с их собственным конкретным контекстом, но в целом они противоречивы.

Эти дополнительные загрузчики классов представлены прикладным способом, чтобы обеспечить изоляцию между ними. Загрузчики классов ниже System-Classpath Classloader распознают класс, только если он указан в файле манифеста для одного из его дочерних элементов.

В J2SE три основных загрузчика классов работают в отношениях "родитель-ребенок" на основе трех принципов:

  1. Делегирование: если класс не загружен (кеш), запрос делегируется его родителю. Это продолжается до вершины иерархии (загрузчик классов Bootstrap), которая загружает основные классы, связанные с J2SE (т.е. Integer, ArrayList, среди других). Это то, на что вы ссылаетесь в своем вопросе: загрузчик классов делегирует загрузку до верха иерархии, затем каждый загрузчик классов пытается загрузить класс, если его родитель не может его найти, пока кто-то не загрузит его. В противном случае: ClassNotFound.
  2. Видимость: классы, загруженные родительским загрузчиком классов, видны его дочерним элементам, а не наоборот.
  3. Уникальность: если родительский загрузчик классов загружает класс, потомки никогда не перезагрузят его.

В Java SE загрузчик классов делегирует загрузку классов своему родительскому загрузчику классов, а затем пытается загрузить сам класс.

Правда, из-за принципов, изложенных выше.

В J2EE нет определенной структуры загрузчика классов (у поставщика есть "поэтическая лицензия" для ее реализации), но они вроде следуют иерархии. В этом случае загрузчик классов System-classpath загружает основное приложение: сервер. Таким образом, серверные библиотеки (в частности, их классы) доступны для каждого приложения благодаря принципу видимости.

Внизу приложения имеют определенные структуры загрузчика классов, но в целом они являются разными потомками загрузчика классов System-classpath. Каждое приложение загружает свои связанные и определенные классы (как приложение, так и библиотеки).

Загрузка здесь не распространяется на родителей за пределами контекста приложения. Зачем? потому что, если бы загрузчик классов System-classpath загружал приложения как обычно, класс каждого приложения был бы видим для других из-за принципа видимости, полностью разрушая изоляцию между ними. Так:

Однако в Java EE загрузчик классов сначала пытается загрузить сам класс, а затем делегировать загрузку классов этого класса его родительскому загрузчику классов.

Это отчасти верно, но я бы предпочел ограничить это утверждение контекстом приложения и исключить связанные с Java классы, которые действительно загружаются загрузчиками классов верхнего уровня.

Короче говоря: это не простой процесс, но я бы не сказал, что J2EE обрабатывает загрузку классов в противоположную сторону от J2SE.

Я думаю, что стандарт загрузки классов Java EE поможет вам на вашем пути. Насколько я знаю, для стандартной Java нет обязательного способа загрузки классов. Однако для WebApps (WAR) указывается, что загрузка классов является родительской.

Другие вопросы по тегам