mirror of
https://github.com/dromara/neutrino-proxy.git
synced 2026-06-06 21:01:21 +08:00
2.7 KiB
2.7 KiB
动态代理策略
AUTO框架按照一定策略动态选择代理方式JDK_DYNAMIC_PROXYJDK动态代理ASGC_PROXY子类继承代理(傲世孤尘代理)
自动代理策略
当被代理类是一个接口时,采用JDK动态代理,否则采用子类代理
JDK动态代理
目前仅支持代理接口,不支持为普通类生成代理。 原因是:JDK动态代理生成的代理类,不能用被代理类的类型接收,而必须用被代理类的接口类型接收,这与目前的设计结构有冲突,后续需要思考优化解决
子类继承代理
顾名思义,通过生成一个被代理类的子类来创建一个代理类实例,因此可以用被代理类类型接收代理实例。 可代理接口、普通类。不能代理静态类、内部类、final修饰的类、final修饰的方法,暂不支持代理抽象类。
拦截器
所有拦截器实例都是单例的,与bean容器打通(这块后期着重优化)
全局拦截器全局维护,由所有代理类共享的拦截器,根据需要可以过滤。普通拦截器代理实例维护,不同的代理实例可共享,需要在被代理类或者方法上加@Intercept注解标注过滤器阉割版的拦截器,用于在目标方法执行前进行过滤操作结果处理器阉割版的拦截器,用于在目标方法执行完毕正常返回后,对返回数据进行处理异常处理器阉割版的拦截器,用于在目标方法执行抛异常后,对异常进行捕获处理
拦截器的继承
不是父类子类的继承,类似于财产的继承。按照继承关系依次是:全局拦截器 -> 类拦截器 -> 方法拦截器
- 所有的代理类都继承全局拦截器,前提是代理类没有排除全局拦截器
- 所有的可代理方法都继承类上的拦截器(
@Intercept在类上标注的拦截器),前提是方法上没有标注排除类上的拦截器。 - 特别的,如果被代理类是一个接口。则这个接口会继承所有父接口的拦截器。
拦截器的执行顺序
- 对于普通类来说,拦截器按照继承顺序执行,也就是会首先执行全局拦截器
- 对于接口来说,先按照拦截器继承顺序,再按照接口继承层级向上传递。如:全局拦截器 -> 类拦截器 -> 方法拦截器 -> 父接口拦截器 -> 爷接口拦截器 -> ...
拦截器的异常处理流程
异常处理与拦截器执行顺序相反,类似于冒泡的过程。
- 末端拦截器处理,若未能捕获,则继续流转
- 全局拦截器处理,若未能捕获、则继续流转
- 若被代理方法声明了对外抛出,则抛给应用层,否则继续流转
- 代理方法处理,直接打印堆栈信息