第二章 IOC + AOP 底层原理

《精通Spring4.x 企业应用开发实战》读书笔记

一、概念

IOC:

  • 假设B类调用了A类,那么A类的对象的创建是由B类来实现;
  • IOC是指将A对象的创建由容器来完成,并且将创建好的对象注入到B类中供B类对象使用

好处:

  • 减少对象的创建工作
  • 解耦B类与A类对象的创建过程

二、Resource接口

  • “classpath:”:只会在第一个加载的com.xxx包的类路径下查找;
  • “classpath*:”:会扫描所有类路径下的com.xxx包中的查找

三、Bean工厂

  • BeanFactory:

    • 容器启动时,将配置文件中的Bean装载到容器(hashMap<beanName, BeanDefinition>)
    • 配置文件中的Bean的初始化是在第一次调用时进行 - “懒实例化”
    • 缓存单例Bean,第二次调用时获取bean从IOC容器缓存中获取(hashMap<beanName, Bean>)
  • ApplicationContext:在BeanFactory的基础上,增加了“国际化支持”和“事件体系”
    • 事件体系:

      • ApplicationEventPublisher:发布事件,实际上会调用ApplicationEventMulticaster实例来发布。
      • ApplicationEventMulticaster:提供了监听器注册表,保存所有的监听器;发布事件,并通知相应的监听器进行相应操作
    • 上下文初始化时,创建所有单例Bean - “急切实例化”  

四、ApplicationContext流水线

1、初始化BeanFactory

  • 创建BeanFactory实例
  • 将配置文件的信息装入BeanDefinitionRegistry(Bean定义注册表)中
    • 使用ResourceLoader将配置文件装载为Resource对象
    • 使用BeanDefinitionReader解析配置信息:将每一个<bean>解析为一个BeanDefinition对象,然后存储到BeanDefinitionRegistry中

2、调用BeanFactoryPostProcessor

  • 根据反射机制从BeanDefinitionRegistry中找出所有实现了BeanFactoryPostProcessor接口的Bean,并调用其postProcessBeanFactory()接口方法,实际上完成的工作主要是:- 可定制点

    • 对使用占位符的<bean>进行解析,得到最终的配置值,即将半成品的BeanDefinition转化为完全体的BeanDefinition对象
    • 根据反射机制从BeanDefinitionRegistry中找出所有实现了java.beans.PropertyEditor接口的Bean,并自动将他们注册到ProperEditorRegistry中

3、注册BeanPostProcessor

  • 根据反射机制从BeanDefinitionRegistry中找出所有实现了BeanPostProcessor接口的Bean,并将他们注册到BeanPostProcessor的注册表中 - 可定制点
  • 重要点:Aop、动态代理都是基于这个实现的

4、初始化国际化信息资源

5、初始化应用上下文事件广播器 - 事件

6、初始化特殊的Bean:钩子方法 - 可定制点

  • springboot在这一步创建了TomcatEmbeddedServletContainer,即内嵌的tomcat容器

7、注册事件监听器到ApplicationEventMulticaster的监听器注册表中

8、初始化所有的单例Bean,使用懒加载的除外;初始化Bean后,放入spring容器的缓冲池(hashMap<beanName, Bean>

  • 取出BeanDefinitionRegistry中的BeanDefinition对象,使用InstantiationStrategy实例化Bean;
  • 使用BeanWrapper结合Bean实例和ProperEditorRegistry对Bean进行属性注入操作;
  • 使用3中注册好的BeanPostProcessor对已经完成属性设置的Bean进行后续加工,装配置出准备就绪的Bean。

9、发布上下文刷新事件 :创建上下文刷新事件,事件广播器负责将这些事件广播到每个注册的事件监听器中 - 事件

五、BeanFactory中Bean生命周期

 六、AOP

两种代理:

  • JDK:基于接口

    • 原理:动态代理 + 反射
    • 定义一个类XxHandler,实现InvocationHandler接口,里边包含真实对象的实例(实际上是一个Object,具体真实对象在运行期赋值给Object),并使用反射调用真实对象的指定方法
    • 使用Proxy.newProxyInstance(ClassLoader, interfaces, InvocationHandler)创建代理对象,之后调用相应的真实对象的方法即可。
      • 由于该方法的第二个对象是interface,所以JDK只能基于接口实现动态代理。
  • CGLib:基于类
    • 原理:动态生成字节码技术,即为将要拦截的类动态生成子类,然后在子类中拦截所有父类的调用并顺势织入横切逻辑。
    • 由于是创建子类,所以不能代理目标类中的private和final方法。

比较:

  • CGLib创建代理对象花费的时间长于JDK,因为要动态生成子类
  • CGLib创建好的代理对象的性能由于JDK
时间: 2024-10-24 05:53:52

第二章 IOC + AOP 底层原理的相关文章

Spring AOP底层原理

------------------siwuxie095 Spring AOP 底层原理 AOP 即 Aspect Oriented Programming,面向切面编程, 即 不通过修改源代码的方式扩展功能 「在不修改源代码的情况下,对程序进行增强」 2.AOP 采取横向抽取机制,取代了传统纵向继承体系重复性 代码 3.AOP 底层原理所使用的技术 (1)JDK 的动态代理:针对实现了接口的类产生代理 即 有接口,使用动态代理创建接口实现类的代理对象 (2)CGLIB 的动态代理:针对没有实现

《Spring技术内幕》笔记-第二章 IoC容器的实现

简介 1,在Spring中,SpringIoC提供了一个基本的JavaBean容器,通过IoC模式管理依赖关系,并通过依赖注入和AOP切面增强了为JavaBean这样子的POJO提供事务管理,生命周期管理等功能. 2,Spring IoC的设计中,主要包含两个主要的容器系列: -1,BeanFactory系列,该序列实现了容器的基本功能. -2,ApplicationContext应用上下文. Spring IoC容器的设计 1,如下图,IoC容器的接口设计图. 2,简介 -1,从BeanFac

spring ioc aop 的原理

IOC(反转控制):对成员变量的赋值的控制权从代码中反转到配置文件中.AOP:Aspect(切面) Oriented(面向) Programming(编程),面向切面编程.差不多就够了,再看就是Spring的事务处理,基本就这些.

第二章--Win32程序运行原理 (部分概念及代码讲解)

学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不能被该线程访问. PS:进程A在其地址空间的0x12345678地址处能够有一个数据结构,而进程B能够在其地址空间的0x12345678处存储一个完全不同的数据.彼此不能访问. 2. 在大多数系统中,Windows将地址空间的一半(4GB的前一半,0x00000000-0x7FFFFFFF)留给进程作为私有存

spring揭秘 第二章 ioc的基本概念

作者:鹿丸不会多项式  出处:http://www.cnblogs.com/hechao123   转载请先与我联系. 在看ico概念之前,先想一下我们平常需要依赖某个类时会怎么做? 无非是在要用到的地方写如下代码: Person person = new Person(); //然后就可以用person对象来获取Person类提供的服务了 person.say("hellow Ioc!"); 先不说这样做有什么不好,想一下我们的目的只是想调用person的说话服务而已,每次调用前都需

第二章:JMeter 工作原理

JMeter的工作原理: 以web性能测试为例, 1.通过 JMeter 来捕获 浏览器的请求 和 Web服务器的响应,捕获到的结果也就是 性能测试脚本 2.通过 性能测试脚本 , JMeter 就可以通过线程组来模拟真实的用户对 Web服务器的 进行压力测试.

汇编学习-第二章(CPU工作原理)

1.逻辑地址与物理地址 逻辑地址:人为假设计算机分散的内存连接一起,并分好段.上面的地址称逻辑地址. 逻辑地址 = 基地址(段地址 * 16) + 偏移地址 物理地址:存储单元在计算机中的唯一编号.CPU访问存储单元需要的地址. 2.通用寄存器 一个典型的CPU,由控制器.运算器.寄存器等组成,通过内部总线连接. 内部总线实现CPU内部期间的联系. 外部总线实现CPU与主板上其他期间联系. 8086有16个通过寄存器 AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,

Spring第二天——IOC注解操作与AOP概念

大致内容 spring的bean管理(注解实现) AOP原理 log4j介绍 spring整合web项目的演示 一.spring注解实现bean管理 注解: 代码中一些特殊的标记,使用注解也可以完成一些相关的功能(写法"@") 方法上.类上(详见基础加强) 使用注解创建对象,注入属性(完成day01相似的功能) 可以使用注解,但不可能完全替代xml配置文件 准备工作: 导入包:除了day01的6个核心jar包(当然包括日志的包) 再加上aop的那个jar包(注解功能在里面),也就是图中

spring ioc aop 原理

spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例.但在spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IoC):创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一个概念. 面向方面编程(AOP)是以另