Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Все ли методы проксируются при использовании Spring AOP?

Автор вопроса: GandalfОтветов: 2

При использовании Spring AOP для создания прокси-сервера для класса с помощью NameMatchMethodPointcutAdvisor и BeanNameAutoProxyCreator делает это, по существу, прокси-сервером для каждого вызова объекта, но применяет рекомендации только к совпадающим методам или каким-то образом создает прокси-объект, который имеет только эти методы и использует обычный объект для звонки, которые должны быть перехвачены?

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

javaspringaopdynamic-proxy

Ответы

Ответ 1 · рейтинг 6 · Bozho

Зависит от используемой техники. (Это настраивается с помощью атрибута proxy-target-class в вашей конфигурации aop)

  • Динамические прокси-серверы JDK являются прокси-серверами по интерфейсу - каждый метод интерфейса проходит через прокси-сервер, как вы сказали, и если он совпадает с "рекомендуемым" методом, применяется советник. В противном случае он делегируется исходному объекту

  • Прокси-серверы CGLIB фактически являются подклассами, определенными во время выполнения ваших конкретных классов. Я не могу быть уверен в этом, но я предполагаю, что переопределяются только "рекомендуемые" методы, остальные сохраняют определение суперкласса.

Однако независимо от того, какой механизм используется:

  • это не ваша забота, как именно реализованы прокси
  • это не оказывает существенного влияния на производительность - Разоблачение мифы: прокси влияют на производительность от команды Spring о мифах о производительности прокси

Ответ 2 · matt b

или каким-то образом создать прокси-объект, который имеет только эти методы и использует обычный объект для вызовов, которые должны быть перехвачены?

Как это будет работать на самом деле? Когда у класса есть ссылка на проксируемый класс, у него есть только одна ссылка на него. Он либо должен вызывать прокси-класс, либо класс без прокси. Spring не может знать, какие методы вы вызываете, и поэтому не может предоставить вам один тип, если вам нужно вызвать рекомендуемый метод, и другой тип, если это не так.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы