【问题标题】:How to wrap method invokation inside bundle?如何将方法调用包装在包中?
【发布时间】:2014-09-18 05:57:55
【问题描述】:

我有 cq5 应用程序。

我们有以下类层次结构(伪代码):

class serviceA{
   methodA1(){...}
   methodA2(){...}
   methodA3(){
      ...
      httprequest
      ...
   }
   methodA4(){...}
}

class serviceB{
   methodB1(){
      ...
      httprequest
      ...
      httprequest
      ...
      httprequest
   }
   methodB2(){...}
   methodB3(){...}
   methodB4(){
     ...
     httprequest
     ...
   }
}

class serviceC{
   methodC1(){
       ...
       httprequest
       ...
       httprequest
       ...
   }
   methodC2(){...}
   methodC3(){    
    ...
    httprequest
    ....
    }
   methodC4(){...}
}

而且我需要在 httprequest 之前和之后记录(以测量时间)。

但是在每个服务内部都更改代码是非常可悲的。

你能提供更优雅的决定吗?

OSGI 会与 Aspectj 一起使用吗?

@AspectService 呢?

【问题讨论】:

    标签: java logging osgi bundle aop


    【解决方案1】:

    如果您严格遵循SOC principle,则必须为 HTTP 请求创建一个单独的类:

    public class HTTPRequest {
        public void doRequest() { ... } // change signature according to your needs
    }
    

    现在必须在您的服务方法中使用此类的实例。

    使用这种设计,很容易放置日志记录行为。只需更改doRequest 方法即可。

    【讨论】:

    • 在这种情况下,我应该在 HTTPRequest 中使用“oldHTTPRequest”类
    • 并重写所有方法
    • 我的同事说我不能使用 AspectJ 但我不明白为什么
    • 也许您的同事只是害怕新技术或未知技术,并使用“不会工作”作为杀手级短语。为什么不能使用 AspectJ?它只需要 Java SE 加上用于编译时编织的运行时库或用于加载时编织的编织代理。结合 OSGi,您可以查看Equinox Weaving 以获取更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2020-12-13
    • 1970-01-01
    • 2014-04-23
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多