以proxyfactorybean 简略了解spring aop

proxyfactorybean实现较aspectj那部分实现要简单,他的使用基本上没有依赖到其他第三方JAR 包,基本上spring 写了这一块的内容。查看这部分内容,对于aop的了解是足够的。
详解前小结:
1.ajpectj那块相比于proxyfactorybean的切面执行顺序有不同,aspectj是将切面的执行顺序进行了排序,并且对于相同类型的切面可以进行排序,其执行顺序
而proxyfactorybean中的切面执行顺序需要自己手动自定,他是按照添加的顺序,依次执行,如开始执行的可能是after ->before->around->after->around->before等顺序,其使用时,不具体指定的话,容易出现问题,但也可以因为其灵活性进行更好自定义,(自定义这个东西,尽量不要用,除非有很大的效果,不然对因后期的人员流动,而导致维护苦难,而且性能也可能因考虑不周到导致出现问题。)
2.proxyfactorybean可以在需要执行时,动态添加一些特定的东西(将这个类定义为原型,然后每次获取添加不同的处理切面),从而实现不同的效果。aspectj源码过于庞大,现暂无能力去了解,所以这一点可能不是有那么准确。
详情:
ProxyFactoryBean
  • 类路径:org.springframework.aop.framework.ProxyFactoryBean
  • 类结构图:
  • 基本类介绍:
TargetClassAware:为了获取这次所要代理的类
Advised:基本类,实现这个接口获取所有的代理配置信息
ProxyConfig:代理信息
AdvisedSupport:代理的超类,用于后续使用方便
ProxyCreatorSupport:这个相当于一个适配器,用于讲配置值给代理工厂(AopProxyFactory aopProxyFactory 默认值为 DefaultAopProxyFactory),让代理工厂根据配置返回不同的代理(jdk动态接口代理,cglib动态类继承代理),而且提供监听器(需实现AdvisedSupportListener),在创建代理前和修改配置时给监听器发送信息。
Aware:标记性接口,
FactoryBean:主要接口,proxyfactorybean使用入口便是此接口的getobject方法。
BeanFactoryAware:提供beanfactory 的赋值方法,
BeanClassLoaderAware:类加载器设置接口,( 虽然知道加载器是双亲委托机制,但是在线程运行时,我不知道这个为何还需要自己设置,使用同级加载器,如果找不到,设置别的加载器便可以吗?
advised,切面获取和拼接切面。
上面的proxyfactorybean做的功能,不多,他只是将配置信息获取,使用代理,返回代理对象,
aop主要重点内容说是如果根据你所写配置一个一个的连接器,然后将让执行真正的方法前,按序调用拦截器,
PS:拦截器链这种实现方式,在很多地方都可以用到,如springmvc的拦截器,struts2的实现,还有servlet 的过滤器实现,(当然其在具体实现的逻辑上面还是有不同的方式,按照我自己的理解可以分为 自旋(在一个方法体内,自己实现调用下一个拦截器),他旋(一个类用于记录当前拦截器,执行完毕再次,执行下一个拦截器,这种方式见得比较多如sevlet 的filter,springmvc的拦截器,struts2没有仔细看,不清楚))
 
 
这些东西在proxyfactorybean中getobject中可见,其第一步便是 初始化adivsor 链 他是通过名称到beanfactory 中获取advices 然后转化为advisor
  • 类图
 
 
  • 基本类解析
Advisor 切面 就是条件和adivce的结合体
 
Advice 标记接口 代表 before after around等方法
代表每个方法,使用地点
Advised 包含多个adivor ,配置文件aopproxyconfig
Interceptor 拦截器 ,用于将符合条件的advice转化为interceptor,然后整合成链
转化过程:
advisor==>advisor.getadivce==>是否符合条件(pointcutadvisor 通过ponitcut的methodmatcher 进行匹配判断 IntroductionAdvisor通过classfilter进行过滤判断)==》通过状态模式使用AdvisorAdapter变成MethodInterceptor。
 
public interface AdvisorAdapter {
boolean supportsAdvice ( Advice advice ) ;
MethodInterceptor getInterceptor ( Advisor advisor ) ;
}
转化完成后进行缓存 methodCache = new ConcurrentHashMap <>( 32 ),缓存目的当然是为了下次再次使用,
 
现在最后一部分便是生成代理:
JdkDynamicAopProxy
ObjenesisCglibAopProxy(基于Objenesis的{@link CglibAopProxy}扩展来创建代理实例*而不调用类的构造函数。不了解)
 
JdkDynamicAopProxy来介绍生成代理对象
其实现主要是以proxy.newinstance(classloader,interfaces,invokehandler(){
invoker(object proxy, object... args,Method method){
 
}
}),实现,在类中,找到代理对象的所有接口,然后找到equal,hashcode方法,为了就是方便后续处理,如果找不到,就使用JdkDynamicAopProxy自定义equal或hashcode方法。
其他的方法调用,此类将其封装成MethodInvocation,一个调用链,
 
其逻辑大概可以概括为
abcd代理一个一个的切面,target目标方法
a(b(c(d(target))))
 
 

猜你喜欢

转载自www.cnblogs.com/niejh/p/11207730.html