一个初级AOP框架的代码
时间: 2024-05-22 20:13:01 浏览: 72
// 定义一个切面
public class LogAspect {
// 定义一个前置通知
public void before() {
System.out.println("执行前置通知");
}
// 定义一个后置通知
public void after() {
System.out.println("执行后置通知");
}
// 定义一个环绕通知
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("执行环绕通知前");
joinPoint.proceed(); // 执行目标方法
System.out.println("执行环绕通知后");
}
// 定义一个异常通知
public void afterThrowing(Exception e) {
System.out.println("执行异常通知:" + e.getMessage());
}
}
// 定义一个切点
@Target(ElementType.METHOD) // 声明该注解只能用于方法上
@Retention(RetentionPolicy.RUNTIME) // 声明该注解在运行时有效
public @interface LogAnnotation {
}
// 定义一个目标类
public class UserService {
// 目标方法
@LogAnnotation // 添加注解
public void addUser() {
System.out.println("添加用户");
}
// 目标方法
public void deleteUser() {
System.out.println("删除用户");
}
}
// 定义一个切面工厂
public class AspectFactory implements MethodInterceptor {
// 获得切面对象
public Object getAspect() {
return new LogAspect();
}
// 实现MethodInterceptor接口的invoke方法
public Object invoke(MethodInvocation invocation) throws Throwable {
// 获取目标方法
Method method = invocation.getMethod();
// 判断目标方法是否添加注解
if (method.isAnnotationPresent(LogAnnotation.class)) {
// 获取切面对象
LogAspect logAspect = (LogAspect) getAspect();
// 执行前置通知
logAspect.before();
try {
// 执行目标方法
Object result = invocation.proceed();
// 执行后置通知
logAspect.after();
return result;
} catch (Exception e) {
// 执行异常通知
logAspect.afterThrowing(e);
throw e;
}
} else {
// 执行目标方法
return invocation.proceed();
}
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
// 创建代理工厂
ProxyFactory proxyFactory = new ProxyFactory();
// 设置目标对象
proxyFactory.setTarget(new UserService());
// 设置切面工厂
proxyFactory.addAdvice(new AspectFactory());
// 获取代理对象
UserService userService = (UserService) proxyFactory.getProxy();
// 调用目标方法
userService.addUser();
userService.deleteUser();
}
}
阅读全文