Spring底层原理

① Spring IOC / DI

Spring IOC / DI概念

将对象创建和属性赋值的权利,转移到spring工厂中完成,解耦和,提高了开发效率,极大提高了代码可维护性。

Spring IOC / DI底层实现原理

  • 问题说明:Spring是如何通过配置文件,就完成了对象的创建和属性的赋值?

答案

  1. 使用工厂设计模式 + 配置文件 + 反射
  2. 描述:
    使用工厂设计模式,在工厂中,根据配置文件中标签的class属性,反射创建出对象。
    再根据标签的子标签标签的name属性,反射找到对应的set方法,反射调用set方法将标签的value属性的值 赋给属性。
    Spring底层原理

② Spring AOP

Spring AOP概念

问:你对Spring AOP有什么理解?

  • 思想: 面向切面编程
    在不修改目标类代码的情况下,在运行时,动态的为目标对象的目标方法增加额外功能,实现解耦合,提高代码的可维护性。

  • 本质: 在不修改目标类代码的情况下,在运行时,动态的为目标对象生成代理对象,用代理对象取而代之,代替目标对象接受调用,变相的实现了功能增强的效果。

B Spring AOP底层实现原理 I

问题说明: Spring AOP是如何生成代理类对象的?

答案: 使用JDK的Proxy的静态方法newProxyInstance,内部执行动态字节码技术,产生代理类对象,产生代理类的对象。基于接口生成的。

  • 代理类的构成要素?
  1. 目标对象的接口
  2. 增强功能的代码
  3. 目标对象,目标方法调用

Spring AOP底层实现原理?
动态字节码技术:java程序生成class文件对应的byte[]
产生思路:

  1. 使用java的动态字节码技术产生代理类的字节数组。
  2. 使用ClassLoader将byte[]转化为代理类的类对象
  3. 通过代理类对象,反射创建类的对象。
    Spring底层原理
具体代码实现

Spring底层原理

C Spring AOP底层实现原理 II

  1. JDK动态生成代理类的缺点:必须要求,目标类有接口。
  2. 第二种静态代理
  • 如果目标类有接口,springaop,会使用基于接口方式(JDK)方式动态生成代理类。
  • 如果目标类没有有接口, springaop也能产生代理类, cglib技术,基于继承成生成的代理类。
    -代理类:
    a. 与目标类拥有相同的方法.
    b. 额外功能
    c. 调用目标对象的方法
    Spring底层原理
  1. cglib动态代理
    动态生成基于继承代理类
  2. cglib编程核心思路
    Spring底层原理
  3. cglib的编码
    Spring底层原理
  4. 总结Spring AOP的原理
  • 如果目标类有接口, springaop 会使用jdk的动态字节码技术,Proxy.newProxyInstance方法,动态产生基于接口的代理类的对象。
  • 如果目标类没有接口,spring啊aop使用cglib的动态字节码技术,动态产生基于继承的代理类的对象。
    上一篇:Spring整合Struts2与Spring整合MyBatis
    下一篇:SpringMVC基本使用