АОП для сторонних классов

Я использовал АОП весной без каких-либо реальных проблем, в основном для управления транзакциями, для которых он прекрасно работает.

Мой вопрос заключается в следующем... единственный пример АОП, который я видел до сих пор, - это указать класс, который вы создали сами. Можно ли указать класс в сторонней библиотеке, например класс подключения к базе данных. Контекст заключается в том, что я хочу создать несколько журналов и собрать информацию, когда источник данных оракула выполняет вызов базы данных, которая, к сожалению, содержится в стеке файлов классов оракула. Как бы вы указали этот класс/метод при выполнении SQL?


person Richard    schedule 30.01.2009    source источник


Ответы (1)


Я думаю, это сработает:

  1. Пусть Spring будет отвечать за инициализацию вашего DataSource
  2. Примените аспект к методу getConnection() в вашем источнике данных.
  3. По вашему совету оберните возвращенное соединение в новый класс («LoggingConnection»), который реализует соединение и делегирует все методы «настоящему» обернутому соединению (я считаю, что это шаблон декоратора)
  4. Добавьте любой код ведения журнала, который вам нужен, в класс «LoggingConnection».

Имейте в виду, что этот подход создает прокси исходного источника данных и делегирует ему полномочия для каждого вызова метода. В контексте операции с базой данных это не должно создавать много дополнительных накладных расходов. Вам нужно быть предельно осторожным в том, что делает ваш код, чтобы он не генерировал исключения и не препятствовал правильному поведению Connections. Возможно, используйте try/catch/finally и поместите вызов, делегирующий «настоящее» соединение, в свой блок finally.

Другой совершенно другой подход — использовать AspectJ и выполнять переплетение во время загрузки. Таким образом, вы можете украсить класс новой функциональностью, как только ClassLoader загрузит его.

person cliff.meyers    schedule 30.01.2009