如何在Java EE中拦截嵌套方法

时间:2018-12-28 10:53:18

标签: java-ee methods interceptor

问题:需要记录每个指定方法的每次执行时间。

研究:尝试Intellij Idea 分析插件。有些没有用,有些很贵。有些太过分了。

在代码中,可以很容易地在方法主体的开始和结束或作为对某些常见类的调用来实现。

一种更简洁的方法是使用拦截器(使用已声明的拦截器类,甚至通过拦截器绑定自定义注释)。但是,只有类的进入方法被拦截(即使在方法间互斥注释的情况下),而我需要更深层次的方法(嵌套)。

Bean类:

@Stateless
@LocalBean
@Interceptors({ProfilerInterceptor.class, LoggingInterceptor.class})
public class ComparisonService {

  @Interceptors({ProfilerInterceptor.class})
  public method aMethod(){

    bMethod();
  }

  @Interceptors({ProfilerInterceptor.class})
  public method bMethod(){

    // Logics for time-measurement.
  }
}

拦截器类:

@Interceptor
@Profiled
public class ProfilerInterceptor {

  @Inject private Logger logger;

  private Object returnedValue;

  @AroundInvoke
  public Object measureExecutionTime(InvocationContext context) throws Exception {

    LocalDateTime start = LocalDateTime.now();

    try {

      returnedValue = context.proceed();

      return returnedValue;

    } finally {

    LocalDateTime end = LocalDateTime.now();
    long difference = Duration.between(start, end).toMillis();

    logger.info(          
 "\n************************************************************************\n"
          + context.getMethod().getName()
          + "() - "
          + difference
          + " мс");
    }
  }
}

Bean XML描述符:

<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  bean-discovery-mode="all"
  xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                  http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">
  <interceptors>
    <class>my.package.LoggerInterceptor</class>
    <class>my.package.ProfilerInterceptor</class>
  </interceptors>
</beans>

问题:如何拦截嵌套方法或在方法级别实现一种装饰器模式(包装器)?

0 个答案:

没有答案