Я не знаю смысла использования прокси-сервера в spring. что эффективно?
В чем смысл использования прокси (динамического прокси) в рамках spring?
Ответ 1
Динамический прокси является особенностью JDK. Его можно использовать для реализации интерфейса с помощью обработчика вызовов.
Динамический класс прокси (просто как прокси-класс ниже) является классом который реализует список интерфейсов указанный во время выполнения, когда класс созданный, с поведением, как описано ниже. Прокси-интерфейс - такой интерфейс, который реализуется прокси-класса. Экземпляр прокси - это экземпляр класса прокси. Каждый прокси-сервер экземпляр имеет связанный вызов объект-обработчик, который реализует интерфейс InvocationHandler.
У динамического прокси есть некоторые накладные расходы. Однако для большинства случаев накладные расходы не будут значительными. Реальная проблема заключается в том, что (более) использование динамических прокси делает приложение сложнее понять и отладить. Например, динамический прокси-сервер будет отображаться с несколькими строками в стеке.
Динамические прокси-серверы часто используются для создания декораторов . Одним из примеров этого является АОП в Spring. (Я не хочу вдаваться в подробности АОП и не использовать терминологию АОП, чтобы все было просто). Если определенные проблемы выполняются в одном классе и используются во многих местах. Динамические прокси (и обработчики вызовов) - это только код клейма (предоставляется Spring) для перехвата вызовов метода. (На самом деле динамические прокси-серверы являются лишь деталью реализации этой возможности. Создание классов "на лету" - это еще одна возможность реализовать ее.)
Ответ 2
Прокси используются AOP. Короче говоря:
Обычно у вас есть.
Caller --> Real object
Но когда, например, вы хотите автоматическое управление транзакциями, spring помещает прокси вашего реального объекта
Caller --> Proxy --> Real object
где прокси запускает транзакцию.
Вот хорошая статья, объясняющая сущность прокси и их эффективность (производительность) в spring
Ответ 3
Мы можем добавить функциональность к классу Java, изменив исходный/байтовый код или используя подкласс или прокси-сервер, который добавляет дополнительные функции и делегирует вызовы базовому объекту.
Ответ 4
AOP также может использовать прокси CGLIB. Это используется для прокси-класса классов вместо интерфейсов.
Ответ 5
Другие ответы хороши, но вот как я думаю об этом очень просто.
- Аннотация означает "добавить скрытый код для дополнительного поведения".
- Структура (или, что то, что известно, что означает средство аннотации) добавляет байт-код, Spring во время выполнения, AspectJ во время компиляции, например.
- Он добавляет код как прокси вместе с перехватчиком. (Обертка, декоратор, адаптер подобны и могут быть понятнее, чем "прокси".)
- Когда программа запускается, перехватчик отправляет выполнение прокси-серверу, который выполняет свою работу, что затем может или не может отправить выполнение классу, который вы закодировали, и что он "обертывается".