有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果我想代理所有服务调用,以便在不显式调用记录器的情况下正确记录它们,我有什么选择?

与其试图让开发人员记住记录每个服务方法调用和/或异常,是否有一种模式可以在记录调用的过程中代理正确的服务方法,并捕获/记录在将响应返回给调用方之前抛出的任何异常?我知道有一种代理模式,但我不确定它是否能满足我的需要。。。如果有一种方法可以创建一个更好地执行日志记录要求的接口,那么我也愿意这么做


共 (2) 个答案

  1. # 1 楼答案

    您可以考虑使用动态代理来实现服务层。

    它使用反射api,因此对服务代码的所有方法调用都将通过一个“invoke”方法进行,您可以在其中记录服务调用、方法参数和异常消息

    public class MyServiceProxy implements InvocationHandler {
                public static Object newInstance(Object obj) {
                        return java.lang.reflect.Proxy.newProxyInstance(
            obj.getClass().getClassLoader(),
            obj.getClass().getInterfaces(),
            new MyServiceProxy(obj));
            }
    
                 public Object invoke(Object proxy, Method m, Object[] args) {
                       // Log method name , parameters etc.
                       try {
                           method.invoke(proxy, args) ;
                       }
                       catch(InvocationTargetException e) {
                          // log your exceptions and do other things
                          throw e.getTargetException();
                       }
                 }
    

    在你呼叫服务的地方,你会这样做

              MyService myServiceRef = (MyService)MyServiceProxy.newInstance(new MyService());
    
  2. # 2 楼答案

    伐木是一个贯穿各领域的问题。你可以使用AOP。看看AspectJSpring AOP