В чем смысл использования прокси (динамического прокси) в spring framework?

Я не знаю смысла использования прокси весной. что такое эффективность?

5 ответов


на динамический прокси является особенностью JDK. Его можно использовать для реализации интерфейса с помощью обработчик вызова.

динамический прокси-класс (просто упоминается в качестве прокси-классом ниже) - это класс который реализует список интерфейсов указано во время выполнения, когда класс создано, с поведением, как описано под. Прокси-интерфейс такой интерфейс, который реализуется прокси-класс. Прокси-экземпляр является экземпляр прокси-класса. Каждый прокси экземпляр имеет связанный вызов объект-обработчик, реализующий интерфейс InvocationHandler.

динамический прокси имеет некоторые накладные расходы. В большинстве случаев затраты не значительные,. Реальная проблема заключается в том, что (более)использование динамических прокси затрудняет понимание и отладку приложения. Например, динамический прокси-сервер будет отображаться с несколькими строками в stacktrace.

динамические прокси часто используется для реализации декораторы. Одним из примеров этого является AOP весной. (Я не хочу вдаваться в подробности AOP и не будет использовать терминологию AOP, чтобы все было просто). Где некоторые проблемы реализуются в одном классе и используются во многих местах. Динамические прокси (и обработчики вызовов) - это только код клея (предоставляемый Spring) для перехвата вызовов метода. (На самом деле, динамические прокси являются только деталью реализации этой возможности. Генерирующий классы на лету-еще одна возможность его реализации.)


Прокси используются AOP. Короче:

обычно у вас есть.

Caller --> Real object

но когда, например, вы хотите автоматическое управление транзакциями, spring ставит прокси вашего реального объекта

Caller --> Proxy --> Real object

где прокси запускает транзакцию.

вот хорошая статья объясняя, как суть прокси и их эффективность (производительность) весной


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


AOP также может использовать прокси CGLIB. Это используется для прокси-классов вместо интерфейсов.


другие ответы хороши, но вот как я думаю об этом в очень простых терминах.

  1. аннотация означает " добавить скрытый код для дополнительного поведения."
  2. платформа (или что-то знает, что означает аннотация) добавляет байт-код, Spring во время выполнения, AspectJ во время компиляции, например.
  3. Он добавляет код в качестве прокси-сервера вместе с перехватчиком. (Обертка, декоратор, адаптер похожи и могут быть проще для понимания, чем "прокси".)
  4. когда программа запускается, перехватчик отправляет выполнение прокси, который делает свое дело, который затем может или не может отправить выполнение классу, который вы закодировали, и что он "обертывает".