При использовании Spring AOP для создания прокси-сервера для класса с помощью NameMatchMethodPointcutAdvisor и BeanNameAutoProxyCreator делает это, по существу, прокси-сервером для каждого вызова объекта, но применяет рекомендации только к совпадающим методам или каким-то образом создает прокси-объект, который имеет только эти методы и использует обычный объект для звонки, которые должны быть перехвачены?
Думаю, я понимаю, что он проксирует каждый вызов объекта, но затем вызывает советник только для соответствующих методов, но я не могу найти хороший пример/сообщение, чтобы подтвердить это.
Ответ 1 · рейтинг 6 · Bozho
Зависит от используемой техники. (Это настраивается с помощью атрибута proxy-target-class в вашей конфигурации aop)
Динамические прокси-серверы JDK являются прокси-серверами по интерфейсу - каждый метод интерфейса проходит через прокси-сервер, как вы сказали, и если он совпадает с "рекомендуемым" методом, применяется советник. В противном случае он делегируется исходному объекту
Прокси-серверы CGLIB фактически являются подклассами, определенными во время выполнения ваших конкретных классов. Я не могу быть уверен в этом, но я предполагаю, что переопределяются только "рекомендуемые" методы, остальные сохраняют определение суперкласса.
Однако независимо от того, какой механизм используется:
- это не ваша забота, как именно реализованы прокси
- это не оказывает существенного влияния на производительность - Разоблачение мифы: прокси влияют на производительность от команды Spring о мифах о производительности прокси
Ответ 2 · matt b
или каким-то образом создать прокси-объект, который имеет только эти методы и использует обычный объект для вызовов, которые должны быть перехвачены?
Как это будет работать на самом деле? Когда у класса есть ссылка на проксируемый класс, у него есть только одна ссылка на него. Он либо должен вызывать прокси-класс, либо класс без прокси. Spring не может знать, какие методы вы вызываете, и поэтому не может предоставить вам один тип, если вам нужно вызвать рекомендуемый метод, и другой тип, если это не так.