《精通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 底层原理的更多相关文章

  1. springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析

    知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...

  2. spring框架的IOC的底层原理

    1.IOC概念:spring容器创建对象并管理 2.IOC的底层原理的具体实现: 1)所使用的技术: (1). dom4j解析xml配置文件 (2).工厂设计模式(解耦合) (3).反射 第一步:配置 ...

  3. Spring Aop底层原理详解

    Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)

  4. spring AOP底层原理实现——jdk动态代理

    spring AOP底层原理实现——jdk动态代理

  5. Spring AOP底层原理

    ------------------siwuxie095                                 Spring AOP 底层原理         AOP 即 Aspect Or ...

  6. Ioc和Aop底层原理

    Spring中主要用到的设计模式有工厂模式和代理模式. IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例:IOC就是一个生产和管理 ...

  7. Spring IOC AOP的原理 如果让你自己设计IOC,AOP如何处理(百度)

    百度的面试官问,如果让你自己设计一个IOC,和AOP,如何设计, 我把IOC的过程答出来了,但是明显不对, (1) IOC 利用了反射,自己有个id,classtype,hashmap,所有的功能都在 ...

  8. JAVA框架 Spring AOP底层原理

    一:AOP(Aspect Oriented Programming)面向切面编程. 底层实现原理是java的动态代理:1.jdk的动态代理.2.spring的cglib代理. jdk的动态代理需要被代 ...

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

    简单介绍 1,在Spring中,SpringIoC提供了一个主要的JavaBean容器.通过IoC模式管理依赖关系.并通过依赖注入和AOP切面增强了为JavaBean这样子的POJO提供事务管理,生命 ...

随机推荐

  1. 使用ApiPost测试接口时需要先登录的接口怎么办(基于Cookie)?

    在后台在开发.调试接口时,常常会遇到需要登陆才能请求的接口. 比如:获取登陆用户的收藏列表,此时,我们就需要模拟登陆状态进行接口调试了.如图: 今天,我们讲解利用ApiPost的环境变量,解决这种需要 ...

  2. P4812 D’s problem(d)

    P4812 D’s problem(d)From: admin 时间: 1000ms / 空间: 65536KiB / Java类名: Main 背景 NOIP春季系列课程 描述 小D是一名魔法师,它 ...

  3. [BZOJ3585]mex(莫队+分块)

    显然可以离线主席树,这里用莫队+分块做.分块的一个重要思想是实现修改与查询时间复杂度的均衡,这里莫队和分块互相弥补. 考虑暴力的分块做法,首先显然大于n的数直接忽略,于是将值域分成sqrt(n)份,每 ...

  4. Atcoder Tenka1 Programmer Contest 2019 题解

    link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define ...

  5. MultiByteToWideChar和WideCharToMultiByte

    CString UTF8ToGB2312(CString str) { int len; // UTF8转换成Unicode len = MultiByteToWideChar(CP_UTF8, 0, ...

  6. Maven 项目不打包 *.hbm.xml 映射文件

    使用 Maven 部署 Java Web 项目时,Hibernate 的映射文件 *.hbm.xml 没有被打包部署到目标目录下,解决方法:在 pom.xml 文件中 <build> 节点 ...

  7. POP3_收取QQ邮箱邮件的问题

    今天纠结了一天的时间,使用pop3协议收取qq邮箱中邮件时,因为一个特别坑爹的问题重新写n次,最后发现是因为qq邮箱设置了独立邮箱密码,必须的用独立邮箱密码登陆才行,/(ㄒoㄒ)/~~!!!! 但今天 ...

  8. In order to use an interrupt in a Cortex-M3/M4, you need the following

    a stack. The core automatically saves several registers on the stack when an interrupt fires. Initia ...

  9. 【DevOps】谁说大象不能跳舞?

    作者:范军 (Frank Fan) 新浪微博:@frankfan7   微信:frankfan7 很多企业,尤其是大企业在产品开发和运维上存在着一些普遍问题,比如开发周期长.人员合作程度不高.开发和运 ...

  10. Android 解压zip文件

    过了n多天后,当再次使用原先博客上写的那篇: Android 压缩解压zip文件 去做zip包的解压的时候,出现了原来没有发现的很多问题.首先是中文汉字问题,使用java的zip包不能很好的解决解压问 ...