Java AOP编程是一种常见的编程范式,它通过将一个应用程序分解为更小的部分来进行开发,从而使得这些小部分的编写和测试更加简单。然而,这种编程方式还需要借助一些工具的支持,比如aspectjweaver,这是一款被广泛应用的AOP框架。本文将围绕着aspectjweaver进行讲解,深入掌握Java AOP编程。
一、什么是aspectjweaver?
aspectjweaver是一个AOP框架,是AspectJ的支持库,通过在Java字节码层面操作,实现了在代码执行的不同地点植入指定的代码,从而增强程序的功能。相比起传统的编程方法,AOP编程能更好的满足日常业务处理的场景需求,提高代码的可维护性和复用性。
二、aspectjweaver的使用
aspectjweaver的使用有三种方式,分别是使用注释、XML配置文件和Java代码。
1. 使用注释
在Java中使用注释需要导入aspectjrt和aspectjweaver两个包,其中aspectjweaver包就是aspectjweaver库提供的实现,同时在代码的开头加上注释@EnableAspectJAutoProxy。
2. XML配置文件
使用XML文件配置,需要在代码中引入AspectJ的语法,即通过
```xml
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aspectj="http://www.springframework.org/schema/aop/aspectj" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
```
3. Java代码
使用Java代码需要重写BeforeAdvice和AfterReturningAdvice接口中的方法,并在配置文件中指定类,如下所示:
```java
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
public class TestAdvice implements MethodBeforeAdvice, AfterReturningAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("执行[" + method.getName() + "]方法之前...");
}
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
System.out.println("执行[" + arg1.getName() + "]方法完毕...");
}
}
```
```xml
```
三、aspectjweaver的原理
当应用启动时,AspectJ在应用程序日志文件中打印日志,表明AspectJ在执行织入操作。织入操作是将切面代码合并到目标应用程序的字节码中。下面是aspectjweaver的原理:
1. 目标程序
AspectJ的织入操作针对的是已经编译后的Java字节码文件,因此,要进行AOP编程,我们首先需要编写目标程序,编译成字节码文件。
2. 切面处理器
切面处理器也就是我们平常使用的AspectJ,它通过织入代码,让程序具有AOP的能力。AspectJ从字节码文件中检测出符合织入条件的代码片段,然后在此处加入特定的处理逻辑,扩展了原有的Java程序的功能。
3. aspectjweaver框架
aspectjweaver作为支持库在处理过程中扮演重要的角色。它是AspectJ在运行时对Java字节码的切面增强的实现,支持不同的编译级别以支持全方位的修改。
4. 类加载器
类加载器是将目标程序的字节码读入Java虚拟机的媒介,同时也是支持切面编程的关键所在。AspectJ扩展ClassLoader,使用增量式类转换,利用PJW哈希算法减少重复织入的代码,以提高织入的性能。
5. 显示代理
显示代理是指在目标对象与切面之间建立一个代理,每次调用目标对象时,代理会检查是否有必要增加切面操作,如果需要,切面则会织入到目标对象中,实现了AOP编程的效果。
四、aspectjweaver的应用场景
aspectjweaver的应用很广泛,一般可以用于以下场景:
1. 统计方法的执行时间
AspectJ可以实现对程序各方法执行时间的监控,这样可以全面掌握程序效率情况,发现瓶颈并筛选出合适的优化方案。比如下面这个示例:
```java
public aspect CountTimerAspect {
pointcut serviceMethod(): execution(* com.example.service.UserService.*(..));
before() : serviceMethod() {
startTime.set(System.nanoTime());
}
after() : serviceMethod() {
long endTime = System.nanoTime();
long durationTime = (endTime - startTime.get()) / 1000 / 1000;
System.out.println("method run duration time : " + durationTime + " ms.");
}
}
```
2. 日志管理
通过AOP编程可以轻松地在指定方法执行前后动态加入日志输出代码,跟踪程序执行动态,方便调试和排查错误。可以采用下面的示例代码:
```java
public aspect LogAspect {
pointcut userInfo() : execution(* com.eyes.zhaonan.service.UserService.*(..));
before() : userInfo() {
System.out.println("日志AOP before.....");
}
after() : userInfo() {
System.out.println("日志AOP after.....");
}
}
```
3. 增加累积器,实现自动计数功能
可以利用AOP在方法执行时,对执行结果进行统计,实现对结果自动计数的功能。代码示例如下:
```java
package com.aspectj;
import java.util.concurrent.atomic.AtomicInteger;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class CounterAspect {
// 用于自增初始值的计数器
private AtomicInteger counter = new AtomicInteger(0);
// 切入点
@Pointcut("execution(* com.aspectj..*(..))")
private void controllerAspect() {}
// 定义在切点入口处自增计数器的方法(注意:这里仅仅只是一个自己定义的方法,并没有真正
// 的进行增加计数器的操作)
private void increase() {
counter.incrementAndGet();
}
// 在方法执行完毕后调用(此时真正的进行增加计数器的操作)
@AfterReturning("controllerAspect()")
public void log() {
increase();
System.out.println("切面方法执行完毕, 在Aspectj内部增加的计数器器加一, 当前值为: " + counter.get());
}
}
```
综上所述,aspectjweaver是AOP框架AspectJ的支持库,也是实现Java AOP编程的重要工具。其优越的性能和灵活性,使得它被众多Java开发者所喜爱和使用,在应用中具有重要的地位和作用。希望本文可以帮助读者更好地掌握Java AOP编程知识,进一步提升开发水平和能力。