Выполнить код до и после метода? - PullRequest
7 голосов
/ 27 сентября 2010

В слое обслуживания у меня есть классы, которые выглядят примерно так:

class MyService {
    public doSomething() {
        TelnetSession session = new TelnetSession();
        session.open("username", "password");
        session.execute("blah");
        session.close();
    }
}

Во многих классах я должен объявить и открыть сессию, а затем в конце закрыть ее.Я бы предпочел сделать что-нибудь с аннотациями, но понятия не имею, с чего начать.Как другие люди делают что-то вроде этого:

class MyService {
    @TelnetTransaction
    public doSomething() {
        session.execute("blah");
    }
}

, где метод, отмеченный @TelnetTransaction, создает, открывает и передает объект TelnetSession.

Спасибо,

Джеймс

Ответы [ 4 ]

13 голосов
/ 27 сентября 2010

До и после - это то, для чего предназначено аспектно-ориентированное программирование.

Spring обрабатывает транзакции с аспектами.Посмотрите Spring AOP или AspectJ.

2 голосов
/ 27 сентября 2010

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

  • Просто сделай это вручную. Я предлагаю всегда начинать с этого, прежде чем приступить к генерации кода.
  • Использовать динамический прокси. К сожалению, java.lang.reflect.Proxy требует добавления интерфейса.
  • Используйте APT (или, по крайней мере, средства обработки аннотаций в 1.6 javac) для генерации кода. Исходный код Java проще, чем байт-код, но я не знаю ни одной хорошей библиотеки для генерации исходного кода Java.
  • Используйте идиому «Выполнить вокруг» вручную - многословно и неуклюже.
1 голос
/ 27 сентября 2010

Как говорит Даффимо, АОП - это путь.Я бы посоветовал вам получить копию

AspectJ в действии

Он написан Рамнивасом Ладдадом, Spring Committer, и охватывает как Spring AOP, так и "настоящий "AspectJ" полностью и понятно.

Для разработки вы должны использовать AspectJ Developer Tools для Eclipse или, еще лучше, SpringSource Tool Suite (он содержит AJDT).

0 голосов
/ 27 сентября 2010

Spring AOP будет вашим лучшим выбором, если вы уже используете это. Если вам нужна инъекция во время выполнения, вам нужно использовать AspectJ. Я помню, что чтение Spring не поддерживает такого рода инъекции

...