Шаблон прокси JAVA EE

Я продолжаю читать везде, что, когда вы просите внедрить зависимости в bean-компонент, вам внедряется прокси-сервер для экземпляра этого ресурса. Кажется, я знаю, что такое прокси, это экземпляр, который знает, как пересылать сообщения другому экземпляру. Также указано, что именно этот шаблон позволяет контейнеру предоставлять услуги этому управляемому компоненту.

Я не очень хорошо это понимаю. Зачем нужен прокси? И как это реализовано? есть ли прокси-объект для каждого компонента? или у меня есть много прокси, пересылающих на один экземпляр? а может ни то ни другое?

Кроме того, из шаблонов дизайна книги из GoF я прочитал, что вы должны предоставить прокси-класс, который действует как заполнитель. Но я никогда не делаю этого в Java EE, создает ли сервер приложений прокси-класс во время выполнения?


person arg20    schedule 03.03.2011    source источник


Ответы (1)


Важным предположением, лежащим в основе шаблона прокси, является то, что вам не нужно заботиться о нем с точки зрения «пользователя». Прокси маскируется под объявленный тип и должен вести себя так же. Дополнительная ценность заключается в том, что делает прокси-сервер до или после того, как он перенаправляет или возвращает вызовы целевому экземпляру. Вот как, например. транзакции и безопасность реализованы в контейнере.

Что касается добавленного вопроса: да, сервер приложений создает эти прокси-классы, когда это необходимо.

person Martin Klinke    schedule 03.03.2011
comment
Мартин. Я думал о вашем ответе и возможной реализации создания прокси-классов во время выполнения. Я придумал, как это может работать. Скажем, у меня есть тестовый класс. Что делает сервер приложений, так это использует API отражения Java, он расширяет тестовый класс и повторяет каждую из его операций, переопределяя их, добавляя, например: вызовы транзакций begin() и end() до и после вызова метода суперкласса, а затем возвращают ссылку на этот дочерний класс, это правильно? - person arg20; 03.03.2011
comment
Да, это, по сути, то, что происходит. Конечно, существуют разные технические способы реализации прокси. Очень простой, но мощный подход заключается в использовании класса DynamicProxy из стандартной библиотеки, если вы хотите сами поэкспериментировать с этой техникой. Другими методами являются улучшение байт-кода и аспектно-ориентированное программирование (которое в большинстве случаев основано на улучшении байт-кода). - person Martin Klinke; 04.03.2011