coding-practicing

AOP

AOP是Aspect Oriented Programming,即面向切面编程

拦截器

最佳实践

装配AOP的时候,使用注解是最好的方式(尽量避免使用类似@Around(“execution(public update(..))”)的语法, 容易误伤,很多不需要被AOP代理的也会被自动代理)

// 定义性能监控的注解
@Target(METHOD)
@Retention(RUNTIME)
public @interface MetricTime {
    String value();
}

// 在需要被监控的关键方法上标注该注解:
@Component
public class UserService {
    // 监控register()方法性能:
    @MetricTime("register")
    public User register(String email, String password, String name) {
        ...
    }
    ...
}

// 定义MetricAspect
@Aspect
@Component
public class MetricAspect {
    @Around("@annotation(metricTime)")
    public Object metric(ProceedingJoinPoint joinPoint, MetricTime metricTime) throws Throwable {
        String name = metricTime.value();
        long start = System.currentTimeMillis();
        try {
            return joinPoint.proceed();
        } finally {
            long t = System.currentTimeMillis() - start;
            // 写入日志或发送至JMX:
            System.err.println("[Metrics] " + name + ": " + t + "ms");
        }
    }
}

无论是使用AspectJ语法,还是配合Annotation,使用AOP,实际上就是让Spring自动为我们创建一个Proxy, 使得调用方能无感知地调用指定方法,但运行期却动态“织入”了其他逻辑,因此,AOP本质上就是一个代理模式。