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

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

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


person Gandalf    schedule 19.02.2010    source источник


Ответы (2)


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

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

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

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

person Bozho    schedule 19.02.2010
comment
Только что закончил читать эту статью (и несколько других), прежде чем я опубликовал этот вопрос. Не беспокоился о затратах на производительность, так как я сохраняю обращения к базе данных, которые будут на много порядков медленнее, чем тысяча прокси-вызовов. Спасибо за ответ. - person Gandalf; 19.02.2010

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

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

person matt b    schedule 19.02.2010