提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
Spring AOP,实现原理之责任链模式调用过程模拟。
提示:以下是本篇文章正文内容,下面案例可供参考
一、SpringAop是什么?
示例:SpringAop的实现是基于jdk动态代理和cglib动态代理来在java进程运行时动态生成字节码文件增强被代理类的技术,体现了一种面向切面编程,可以让业务代码和非业务相关代码实现解耦合。
二、SpringAop责任链模式模拟
1.引入库
代码如下(示例):
准备工作
//声明两低级切面以及需要代理的目标类
package org.springframework.aop.framework;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class TestSpringAop {
static class Target{
public void foo() {
System.out.println("target.foo()");
}
}
static class Advice1 implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Advice1.before()");
Object object = invocation.proceed();
System.out.println("Advice1.after()");
return object;
}
}
static class Advice2 implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Advice1.before()");
Object object = invocation.proceed();
System.out.println("Advice1.after()");
return object;
}
}
}
模拟执行调用链,递归执行
//模拟调用链
package org.springframework.aop.framework;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
import java.util.List;
public class MyInvocationT implements MethodInvocation {
private Object target;
private Method method;
private Object[] args;
List<MethodInterceptor> methodInterceptorList;
private int count = 0;
public MyInvocationT(Object target, Method method, Object[] args, List<MethodInterceptor> methodInterceptorList) {
this.target = target;
this.method = method;
this.args = args;
this.methodInterceptorList = methodInterceptorList;
}
@Override
public Method getMethod() {
return method;
}
@Override
public Object[] getArguments() {
return args;
}
@Override
public Object proceed() throws Throwable {
if (count >= methodInterceptorList.size()) {
return method.invoke(target,args);
}
// 逐一调用通知count+1;
MethodInterceptor methodInterceptor = methodInterceptorList.get(count++);
return methodInterceptor.invoke(this);
}
@Override
public Object getThis() {
return target;
}
@Override
public AccessibleObject getStaticPart() {
return method;
}
public static void main(String[] args) throws Throwable {
TestSpringAop.Target target = new TestSpringAop.Target();
List<MethodInterceptor> list = List.of(
new TestSpringAop.Advice1(),
new TestSpringAop.Advice2()
);
MyInvocationT myInvocation = new MyInvocationT(target, TestSpringAop.Target.class.getMethod("foo"), new Object[0], list);
myInvocation.proceed();
}
}
总结
例如:spring中用到了很多设计模式,如单例模式,原型模式,工厂模式,适配器模式,责任链模式,模板方法模式等等,学习spring源码非常利于我们对设计模式的掌握。