SrpingAOP源码分析-AOP

概念

切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”。
连接点(Joinpoint) :程序执行过程中的某一行为。
通知(Advice) :“切面”对于某个“连接点”所产生的动作。
切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联。
目标对象(Target Object) :被一个或者多个切面所通知的对象。
AOP代理(AOP Proxy) 在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。

通知(Advice)类型:

前置通知(Before advice):在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。ApplicationContext中在<aop:aspect>里面使用<aop:before>元素进行声明。
后直通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。ApplicationContext中在<aop:aspect>里面使用<aop:after>元素进行声明。
返回后通知(After return advice) :在某连接点正常完成后执行的通知,不包括抛出异常的情况。ApplicationContext中在<aop:aspect>里面使用<after-returning>元素进行声明。
环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。ApplicationContext中在<aop:aspect>里面使用<aop:around>元素进行声明。

抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。 ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。

切入点表达式:如 executution(* com.spring.service.*.*(...))

特点

1. 降低模块之间的耦合度
2. 使系统容易扩展
3. 更好的代码复用

流程说明

  1. AOP标签的定义解析切点肯定也是从NamespaceHandlerSupport的实现类开始解析的,这个实现类就是AopNamespaceHandler
  2. 要启用AOP,我们一般会在Spring里面配置<aop:aspectj-autoproxy/>,所以在配置文件中在遇到aspectj-autoproxy标签的时候我们会采用AspectJAutoProxyBeanDefinitionParser解析器
  3. 进入AspectJAutoProxyBeanDefinitionParser解析器后,调用AspectJAutoProxyBeanDefinitionParser已覆盖BeanDefinitionParser的parser方法,然后parser方法把请求转交给了AopNamespaceUtilsregisterAspectJAnnotationAutoProxyCreatorIfNecessary去处理
  4. 进入AopNamespaceUtilsregisterAspectJAnnotationAutoProxyCreatorIfNecessary方法后,先调用AopConfigUtilsregisterAspectJAnnotationAutoProxyCreatorIfNecessary方法,里面在转发调用给registerOrEscalateApcAsRequired,注册或者升级AnnotationAwareAspectJAutoProxyCreator类。对于AOP的实现,基本是靠AnnotationAwareAspectJAutoProxyCreator去完成的,它可以根据@point注解定义的切点来代理相匹配的bean。
  5. AopConfigUtilsregisterAspectJAnnotationAutoProxyCreatorIfNecessary方法处理完成之后,接下来会调用useClassProxyingIfNecessary() 处理proxy-target-class以及expose-proxy属性。如果将proxy-target-class设置为true的话,那么会强制使用CGLIB代理,否则使用jdk动态代理,expose-proxy属性是为了解决有时候目标对象内部的自我调用无法实现切面增强。
  6. 最后的调用registerComponentIfNecessary方法,注册组建并且通知便于监听器做进一步处理。

创建AOP代理
AOP的核心逻辑是在AnnotationAwareAspectJAutoProxyCreator类的postProcessAfterInitialization()这个方法,然后接下来是调用wrapIfNecessary方法。


##

Netty源码阅读(整体介绍)

Netty的作用

  1. Netty实现对Java NIO的封装,提供了更方便使用的接口;

  2. Netty利用责任链模式实现了ChannelPipeline这一概念,基于CHannelPipeline,我们可以优雅的实现网络消息的处理(可插拔,解耦);

  3. Netty的Reactor线程模型,利用无锁化提高了系统的性能;

  4. Netty实现了ByteBuf用于对字节进行缓存和操作,相比JDK的ByteBuffer,他更容易用,同时还提供了Buffer池的功能,对于UnpooledDirectByteBuf和PooledByteBuf,Netty还对其内存使用进行了跟踪,发现内存泄漏时会给出报警。

Netty对JDK NIO的封装

JDK NIO有ServerSocketChannel、SocketChannel、Selector、Selection几个核心概念。

Netty提供了一个Channel接口统一了对网络的IO操作,其底层的IO是交给Unsafe接口实现,而Channel主要负责更高层次的read、write、flush和ChannelPipeline、Eventloop等组件的交互,以及一些状态的展示;做到了职责的清晰划分,对使用者是很友好的,规避了JDK NIO中一些比较繁琐负责的概念和流程。

Channel、Unsafe继承UML图

Channel和Unsafe是分多级别是实现的

ChannelPipeline责任链模式

Dubbo在跨服中的使用

为什么进行拆分

  1. 系统体量
  2. 维护代价
  3. 开发效率
  4. 单机性能瓶颈
  5. 系统容错性

rpc框架

拆分带来的问题

  1. 复杂度的上升

注册中心Zookeeoper

  1. 服务的注册与发现
  2. 动态配置的

duboo工作原理

  1. Directory
  2. Router
  3. Cluster
  4. LoadBalance