Выполнить код до и после метода?

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

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 ответов


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

Spring обрабатывает транзакции с аспектами. Дайте весной AOP или AspectJ взгляд.


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

  • просто сделайте это вручную. Я предлагаю всегда начинать так, прежде чем нажимать генерацию кода.
  • использовать динамический прокси. К сожалению java.lang.reflect.Proxy требует чтобы добавить интерфейс.
  • используйте APT (или, по крайней мере, средства обработки аннотаций в 1.6 javac) для генерации кода. Java source проще байт-кода, но я не знаю хороших библиотек для генерации исходного кода Java.
  • используйте идиому Execute Around вручную-многословную и неуклюжую.

Как duffymo говорит, АОП является способом пойти. Я бы посоветовал вам получить копию

AspectJ в действии

написано Ramnivas Laddad, Весна коммиттер, и он охватывает как весна АОП и "Реал" в AspectJ тщательно и понятно.

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


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