第二章 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 - “急切实例化”
- 事件体系:
四、Spring启动流程

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。
- 初始化 - init-method
- 放入缓冲池(单例),多例交给调用者(后续该Bean的生命周期由垃圾回收来定了)
9、发布上下文刷新事件 :创建上下文刷新事件,事件广播器负责将这些事件广播到每个注册的事件监听器中 - 事件
类比:springboot启动核心流程
1、创建SpringApplication对象
- 判断是否是web环境
- 创建并初始化ApplicationInitializer列表
- 创建并初始化ApplicationListener列表
- 初始化主类mainApplicationClass
2、执行run方法
- 获取SpringApplicationRunListeners
- 创建了EventPublishingRunListener实例
- 创建事件广播器
SimpleApplicationEventMulticaster实例 - 将之前初始化好的ApplicationListener列表全部注册到事件广播器的事件注册表中
- 创建并初始化ConfigurableEnvironment
- 创建一个MutablePropertySources复合属性源
- 构造包含server.port等启动参数的属性源,并设置到复合属性源的首部,优先级最高
- 读取application.properties文件内容,并构造为一个name为“applicationConfigurationProperties”的属性源,并设置到复合属性源的尾部
- 创建ConfigurableApplicationContext
- 准备ConfigurableApplicationContext
- 执行初始化好了的ApplicationInitializer列表
- 刷新ConfigurableApplicationContext
- 将spring启动流程执行了一遍
- 容器刷新后动作
- SpringApplicationRunListeners发布finish事件
五、BeanFactory中Bean生命周期

大致来讲:
- 创建Bean实例
- 设置属性值以及对其他Bean的引用
- 初始化 - init-method
- 放入缓冲池(单例),多例交给调用者(后续该Bean的生命周期由垃圾回收来定了)
- 销毁Bean - destroy - method
六、AOP
两种代理:
- JDK:基于接口
- 原理:动态代理 + 反射
- 定义一个类XxHandler,实现InvocationHandler接口,里边包含真实对象的实例(实际上是一个Object,具体真实对象在运行期赋值给Object),并使用反射调用真实对象的指定方法
- 使用Proxy.newProxyInstance(ClassLoader, interfaces, InvocationHandler)创建代理对象,之后调用相应的真实对象的方法即可。
- 由于该方法的第二个对象是interface,所以JDK只能基于接口实现动态代理。
- CGLib:基于类
- 原理:动态生成字节码技术,即为将要拦截的类动态生成子类,然后在子类中拦截所有父类的调用并顺势织入横切逻辑。
- 由于是创建子类,所以不能代理目标类中的private和final方法。
比较:
- CGLib创建代理对象花费的时间长于JDK,因为要动态生成子类
- CGLib创建好的代理对象的性能由于JDK
第二章 IOC + AOP 底层原理的更多相关文章
- springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析
知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...
- spring框架的IOC的底层原理
1.IOC概念:spring容器创建对象并管理 2.IOC的底层原理的具体实现: 1)所使用的技术: (1). dom4j解析xml配置文件 (2).工厂设计模式(解耦合) (3).反射 第一步:配置 ...
- Spring Aop底层原理详解
Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)
- spring AOP底层原理实现——jdk动态代理
spring AOP底层原理实现——jdk动态代理
- Spring AOP底层原理
------------------siwuxie095 Spring AOP 底层原理 AOP 即 Aspect Or ...
- Ioc和Aop底层原理
Spring中主要用到的设计模式有工厂模式和代理模式. IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例:IOC就是一个生产和管理 ...
- Spring IOC AOP的原理 如果让你自己设计IOC,AOP如何处理(百度)
百度的面试官问,如果让你自己设计一个IOC,和AOP,如何设计, 我把IOC的过程答出来了,但是明显不对, (1) IOC 利用了反射,自己有个id,classtype,hashmap,所有的功能都在 ...
- JAVA框架 Spring AOP底层原理
一:AOP(Aspect Oriented Programming)面向切面编程. 底层实现原理是java的动态代理:1.jdk的动态代理.2.spring的cglib代理. jdk的动态代理需要被代 ...
- 《Spring技术内幕》笔记-第二章 IoC容器的实现
简单介绍 1,在Spring中,SpringIoC提供了一个主要的JavaBean容器.通过IoC模式管理依赖关系.并通过依赖注入和AOP切面增强了为JavaBean这样子的POJO提供事务管理,生命 ...
随机推荐
- Python3 决策树ID3算法实现
# -*- coding: utf-8 -*- """ Created on Wed Jan 24 19:01:40 2018 @author: markli 采用信息增 ...
- JavaWeb中Tomcat与Eclipse的集成—步骤详解
前面会简单介绍,下翻Tomcat与Eclipse的集成 一.先介绍一下应用程序的结构: 1.到目前为止应用程序物理结构有两种: C/S——Client / server:这种结构的应用,客户端与服务端 ...
- mysql索引原理剖析
一.索引的原理 所谓索引,即是快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(B+树相比B树,其非叶子节点占用更小的空间,可以有更多非叶子节点存放在再内存中,减少大量的IO ...
- 我希望我知道的七个JavaScript技巧
如果你是一个JavaScript新手或仅仅最近才在你的开发工作中接触它,你可能感到沮丧.所有的语言都有自己的怪癖(quirks)——但从基于强类型的服务器端语言转移过来的开发人员可能会感到困惑.我就曾 ...
- 一些收集的MikroTik RouterOS破解版虚拟机VMware
会不定期更新,也许后续自己来做,现在是收集.持续关注这个分享链接即可. 链接:https://pan.baidu.com/s/1j7ciesPm1yAgCJ26dLJ8sg 密码:i64w
- 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。
学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 微软收购跨平台移动开发公司Xamarin
摘要:北京时间2月25日早间消息,微软周三宣布收购创业公司Xamarin,这也是该公司为了吸引更多软件工程师为其云计算服务编写程序而采取的最新举措.古斯里表示,总部位于旧金山的Xamarin创立于20 ...
- 怎样用javascript获取UUID
因为javascript是单线程的东西,所以我们放一个累加变量作为id也不会反复. 但事实上javascript本身提供了能够获得唯一id的东东.还记得setTimeout()方法会返回一个唯一id用 ...
- AutoMapper在MVC中的运用04-string映射各种类型、一个属性映射多个属性等
本篇AutoMapper使用场景: ※ 类型转换,源string类型分别转换成int, DateTime,Type ※ 源和目标都包含复杂类型属性 ※ 把源中的一个属性映射到目标中的多个属性 类型转换 ...
- CAD扩展属性的提取--FME方式
一.CAD的扩展属性 了解一下CAD的扩展属性方式,CAD的扩展属性包括二类: 基于CAD二次开发的软件产品(例如南方cass),其扩展属性是附属在图形(点.多段线.注记.面)上面的,它是以XReco ...