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