АОП для сторонних классов - PullRequest
1 голос
/ 30 января 2009

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

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

1 Ответ

2 голосов
/ 30 января 2009

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

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

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

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

...