2010-02-19 4 views
4

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

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

ответ

6

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

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

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

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

  • это не ваша забота, как именно это прокси реализованы
  • это не влияет на производительность существенным образом - Debunking myths: proxies impact performance по Весна команда о производительности прокси мифы
+0

Только что закончил читать эту статью (и несколько других), прежде чем я разместил этот вопрос. Меня не беспокоили затраты на производительность, так как я экономлю поездки в базу данных, которая будет на несколько порядков медленнее, чем тысячи вызовов прокси. Спасибо за ответ. – Gandalf

0

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

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

Смежные вопросы