在方法之前和之后执行代码?

时间:2010-09-27 15:27:43

标签: java dependency-injection annotations

在服务层中,我有一个类似于:

的类
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 个答案:

答案 0 :(得分:13)

之前和之后是面向方面的编程。

Spring使用方面处理事务。给Spring AOP或AspectJ看一看。

答案 1 :(得分:2)

除非您正在做一些有趣的事情,否则您希望最终得到一个委托给服务对象的对象,并执行。两种类型都没有理由实现完全相同的接口,并且没有理由说明它们不应该这样做。有很多方法可以达到这个目的:

  • 只需手动完成。我建议在开始代码生成之前始终这样开始。
  • 使用动态代理。不幸的是,java.lang.reflect.Proxy要求您添加界面。
  • 使用APT(或至少1.6 javac中的注释处理工具)生成代码。 Java源代码比字节码更容易,但我不知道有任何用于Java源代码生成的好库。
  • 手工使用Execute Around成语 - 冗长而笨拙。

答案 2 :(得分:1)

正如duffymo所说,AOP是要走的路。我建议你得到一份

AspectJ in Action

它是由Spring提交者Ramnivas Laddad编写的,它完全涵盖了Spring AOP和“真正的”AspectJ。

对于开发,你应该使用AspectJ Developer Tools用于Eclipse或更好的SpringSource Tool Suite(它包含AJDT)。

答案 3 :(得分:0)

如果你已经在使用它,那么Spring AOP将是你最好的选择。如果需要运行时注入,则需要使用AspectJ。我记得读过Spring不支持那种注射