Прокси -режим использует объект прокси для выполнения запроса пользователя и блокирует доступ пользователя к реальному объекту.
Прокси -режим имеет много применений, например, по соображениям безопасности, необходимо заблокировать клиента от непосредственного доступа к реальному объекту; или в удаленных вызовах, объект прокси необходимо использовать для обработки технических деталей в удаленном методе; или для улучшения системы, реальный объект инкапсулируется для достижения цели задержки нагрузки.
Когда система запускается, разделение метода, который потребляет большинство ресурсов с помощью прокси -режима, может ускорить скорость запуска системы и сократить время ожидания пользователя. Когда пользователь на самом деле выполняет запрос, класс прокси -сервера загружает реальный класс, чтобы заполнить запрос пользователя. Это цель использования прокси -режима для достижения ленивой загрузки.
1. Статическая прокси -реализация:
Интерфейс темы:
Публичный интерфейс idbquery {string request (); } Реальная тема:
открытый класс dbquery реализует idbquery {public dbquery () {try {thread.sleep (10000); } catch (Exception e) {e.printstackTrace (); }} public String request () {return "string request"; }} Класс прокси:
public class idbqueryproxy реализует idbquery {private dbquery dbquery; public String request () {if (dbquery == null) dbquery = new dbquery (); return dbquery.request (); }} Наконец, основная функция:
public class proxytext {public static void main (string [] args) {idbquery dbquery = new idbqueryproxy (); System.out.println (dbquery.request ()); }}Статический прокси-примечание, что класс прокси-это общий интерфейс для реализации реальных классов, а класс прокси относится к реальным объектам класса и помещает многократные операции в методе прокси-класса для его реализации.
Динамический прокси:
Динамический прокси при запуске, динамически генерирует классы прокси. То есть байт -код класса прокси сгенерируется и загружается во время выполнения. По сравнению со статическими агентами динамические агенты не должны быть осторожны, чтобы инкапсулировать совершенно идентичный класс инкапсуляции для реальной цели. Если есть много тематических интерфейсов, раздражает писать метод прокси для каждого интерфейса. Если интерфейс меняется, необходимо изменить как реальный класс, так и класс прокси, что не способствует обслуживанию системы; Во -вторых, методы генерации некоторых динамических агентов могут даже работать во время выполнения, которая представляет собой указанную логику выполнения класса прокси, тем самым значительно улучшая гибкость системы.
Интерфейс темы:
Публичный интерфейс idbquery {string request (); } JDK Proxy Class:
открытый класс JDBDBQUERYHANDLER реализует vocationHandler {idbquery idbquery = null; @Override public object invoke (Object Proxy, метод метода, объект [] args) бросает Throwable {if (idbquery == null) {idbquery = new dbquery (); } return idbquery.request (); } public static idbquery createjdbproxy () {idbquery jdkproxy = (idbquery) proxy.newproxyinstance (classloader.getsystemclasshloader (), новый класс [] {idbquery.class}, new jdbdbqueryhandler ()); System.out.println ("jdbdbqueryhandler.createjdbproxy ()"); вернуть jdkproxy; }} Основная функция:
Public Class ProxyText {public static void main (string [] args) {idbquery idbquery = jdbdbqueryhandler.createjdbproxy (); System.out.println (idbquery.request ()); }}Кроме того, вы также можете использовать динамический прокси-прокси-сервер Cglib и Javassist для динамического прокси-сервера JDK, но процесс создания динамического класса JDK является самым быстрым, поскольку встроенный метод DifineClass () определяется как нативная реализация, поэтому его производительность лучше других. В вызовах функций прокси -классов динамический прокси JDK не так хорош, как динамический прокси -сервер Cglib и Javassist, в то время как динамический прокси -прокси -давасист обладает худшим качеством производительности и даже хуже, чем реализация JDK. В фактических приложениях разработки частота вызова метода класса прокси намного выше, чем фактическая частота генерации класса прокси, поэтому метод, вызывающий производительность динамического прокси, должен стать центром производительности. Dynk Dynamic Proxy Mands, которые классы прокси и реальные темы реализуют унифицированные интерфейсы, а динамический прокси -сервер Cglib и Javassist не имеют таких требований.
В Java реализация Dynamic Proxy включает использование класса загрузчика. Принимая CGLIB в качестве примера, описано краткое описание процесса загрузки динамических классов. Используя CGLIB для генерации динамического прокси, вам сначала необходимо генерировать экземпляр класса Enhancer и сформулировать класс обратного вызова для обработки прокси -бизнеса. В методе Enhancer.Create () байт -код класса прокси будет генерироваться с использованием метода DefaultGenatoratortrategy.Generate () и сохранен в массиве байтов. Затем метод Callututilutils.defineClass () и с помощью отражения, вызов ClassLoader.DefineClass () Метод загрузки байт -кода в класс загрузчик для завершения загрузки класса. Наконец, с помощью метода RefertutuTils.newinStance () динамический экземпляр класса генерируется отражением, и экземпляр возвращается. Другие отличаются от деталей процесса, но логика генерации одинакова.
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.