Java AOP知识详细介绍
什么是AOP
AOP(Aspect-Oriented Programming)即面向切面编程,它能够将分散在应用程序各个部分的不同行为进行归纳和集中处理,使得横向依赖关系得到了有效管理,易于程序的开发和维护。
AOP术语
- Aspect(切面):横向关注点,其中包括一组横跨多个对象的行为。
- Join point(连接点):在程序执行过程中能够插入横向关注点的点,例如方法调用、异常处理等。
- Pointcut(切点):在程序中通过正则表达式匹配出目标连接点集合,通常使用注解或XML定义。
- Advice(通知):在连接点处嵌入的横向行为,可以是在目标方法执行前或后执行的一些操作。
- Weaving(织入):将切面和目标对象联系起来,通过动态生成字节码或者使用Java虚拟机和类加载器等机制将切面和原始代码织入到目标对象中。
- Target Object(目标对象):需要织入切面行为的目标对象,例如Spring中的Bean对象。
AOP实现方式
Java中AOP的实现方式有两种:静态织入和动态织入。
静态织入
静态织入是指在编译时或者类加载时将切面织入到目标代码中,在程序运行时切面将产生作用。静态织入需要使用专门的编译器或者增强工具,例如AspectJ。
动态织入
动态织入是指在程序运行时将切面织入到目标对象中,在程序执行时切面将产生作用。Spring AOP就是典型的动态织入,Spring通过使用JDK动态代理或者CGLIB代理技术,在目标对象方法调用时动态织入切面。
AOP示例
基于注解的AOP
假设我们需要统计每个方法的执行时间,我们可以通过AOP来实现这一功能。
首先我们需要定义一个@TimeLog注解来标记需要统计执行时间的方法,然后使用@Around通知来对方法进行增强,统计执行时间并输出日志。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeLog {
}
@Component
@Aspect
public class TimeLogAspect {
@Around("@annotation(com.example.demo.aop.TimeLog)")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
Logger.info("Method: {}(), Execute Time: {}ms", joinPoint.getSignature().getName(), endTime - startTime);
return result;
}
}
@Service
public class DemoService {
@TimeLog
public void hello() {
Logger.info("hello");
}
}
基于XML的AOP
如果我们需要对Controller层的接口进行AOP增强,我们可以通过配置XML文件来实现。
首先我们需要在XML文件中定义切面、切点和通知,然后在Controller层的接口方法中使用@Pointcut注解来定义切点,使用@Around注解来织入切面。
public class DemoController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "hello";
}
}
<bean id="demoController" class="com.example.demo.controller.DemoController"/>
<bean id="exceptionLogAspect" class="com.example.demo.aop.ExceptionLogAspect"/>
<aop:config>
<aop:aspect id="myAspect" ref="exceptionLogAspect">
<aop:pointcut id="myPointcut" expression="execution(* com.example.demo.controller.*.*(..))"/>
<aop:around pointcut-ref="myPointcut" method="around"/>
</aop:aspect>
</aop:config>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java AOP知识详细介绍 - Python技术站