Spring技术内幕笔记(1):IoC和AOP

IoC容器的实现

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,能够用来减低计算机代码之间的耦合度。编程

依赖反转是什么

依赖反转在Spring中的体现是依赖注入。 缓存

类经过引用来进行合做,这种引用造成了类之间的依赖,若是这种依赖关系须要对象本身管理,那么代码会产生高度的耦合,致使开发和测试上的困难。若是这种依赖的管理交给框架来作,将简化面向对象系统的复杂性,这就是依赖的反转。框架

Spring中的容器是什么

容器用来管理应用中的对象和其之间的依赖关系。BeanFactory是对容器的一种抽象,ApplicationContext是其高级实现。函数

IoC的初始化过程

总体过程分三步:测试

  1. Resourece定位,也就是定位定义Bean资源的位置。Resourece的位置是多样的,使用比较多的是FileSystemResourece。
  2. BeanDefinition载入。读取定义的内容,将用户定义的Bean表示成BeanDefinition,BeanDefinition是在容器中对POJO的抽象,记录了配置的bean信息。
  3. 向IoC容器注册BeanDefinition,IoC用HashMap结构来维护注册的BeanDefinition。

注意这里只是有Bean的载入,而不是依赖注入,依赖注入发生在第一次经过getBean向容器获取Bean的时候。spa

依赖注入过程

在发起getBean方法时,才会进行依赖注入,建立响应的bean。 设计

依赖注入过程以下:代理

  1. 判断单例bean是否已经建立,建立过的无需重复建立。
  2. 递归建立依赖的bean。
  3. 最后建立目标bean实例。code

    • 实例化Java对象。采用了CGLIB或者JVM反射机制来生成对象。CGLIB能够在运行期动态的生成新的class。
    • 注入属性依赖。

Bean的生命周期

在IoC初始化后,Bean并无被实际的建立。在getBean后,才会有bean的实例化,bean的生命周期以下: 对象

建立bean实例->设置bean的属性->调用bean的初始化方法(initialization)->应用可使用bean->容器关闭,销毁bean

Bean的lazy init

上述可知,bean会在使用时才会真正的建立,这防止了建立大量用不到的bean实例。

固然,能够经过设置参数,让bean在IoC容器初始化完毕后就建立。

IoC感知的Bean

Bean通常状况下不须要知道IoC容器的存在,有时候则须要。Bean能够实现一些aware接口来得到想要的容器属性。

如ApplicationContextAware,能够在Bean中得到上下文,从而在Bean中使用上下文。

AOP的实现

AOP的做用

分离关注点使解决特定领域问题的代码从业务逻辑中独立出来。

基本概念

Advice通知:描述方法调用注入的切面行为。
Pointcut切点:用来描述须要加强的方法集合。
Advisor通知器:将Advice和Pointcut结合起来。

JVM的动态代理

在代理模式中,会设计一个和目标对象有着一致接口的代理对象Proxy,客户端对目标对象的请求都会发送给代理对象,而客户端对此毫无察觉。
图片描述

该模式使得Proxy有机会对原始的对象的行为进行必定的修改,能够在执行前和执行后分别执行必定的动做,从而加强原始行为。

AopProxy的实现原理

首先须要定义一些Advisor,这些Advisor定义了须要织入的加强功能,也就是涵盖了通知的内容。而后定义ProxyFactoryBean,它将会生成目标的代理对象。在配置中,ProxyFactoryBean须要知道其代理的目标是谁,代理的接口是哪一个,有哪些Advisor须要添加。

ProxyFactoryBean生成AopProxy过程:

  1. 初始化通知器链。经过getBean获取通知器的bean,而后加入。ProxyFactoryBean只在第一次得到AopProxy时初始化。
  2. 生成代理对象。

    • JDK生成,须要设置ClassLoader和代理接口。
    • CGLIB生成。

AopProxy工做过程:

  1. 当目标对象被调用时,会触发Proxy的回调函数进行拦截。
  2. 首先获取拦截器。从上述中初始化的通知器链中,遍历并获取匹配目标方法的通知器,而后获取通知器对应的拦截器,该结果会被缓存。
  3. 调用器会依次迭代调用拦截器(interceptor)进行加强,最后调用目标方法。

通知器封装为拦截器:

  1. 拦截器默认分为三类:MethodBeforeAdviceIntercepter、AfterReturn...、Throws...。
  2. 一个Advice会多是MethodBeforeAdvice、AfterReturn...、Throws...其中的一个或者多个。
  3. 根据Advice的种类,适配器AdviceAdapter将其包装为相应的intercepter,intercepter中的invoke方法会根据before、after或者throw将advice的加强行为放置到适当位置。适配器默认是上述的三种,能够自定义adapter注册进来,以生成本身定制的intercepter。
  4. 调用器执行拦截器链的时候,递归过程:process(调用器)->invoke(intercepter)->process(调用器)->invoke(下一个intercepter)...->目标方法。因此intercepter会根据本身的种类在递归调用前或者后执行advice的方法。
相关文章
相关标签/搜索