Spring技术内幕笔记2--我懒不写了哈哈哈哈。
再次阅读这本书有些不一样的感悟,记录一些零星点点。
1.1 关于IOC容器设计的线路区别
我们都知道在Spring里主要有两种设计IOC容器的思路,一种是围绕BeanFactory,另外一种是围绕ApplicationContext展开。这两种设计的主要区别在哪里?
从头回忆一下两种设计方案的实现
1.1.1 BeanFactory
以下是BeanFactory接口:
处于IOC顶层的设计接口BeanFactory只提供了一些基本的方法,getBean(),containsBean(),isSingleton()等等。
我们以XmlBeanFactory为例子展示创建它的过程:
首先是一张UML图:
构造函数:
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader = new XmlBeanDefinitionReader(this);
this.reader.loadBeanDefinitions(resource);
}
可以看出创建以BeanFactory为设计路线的IOC容器的时候主要有四步:
- 创建Rerouce资源类,定位到xml。
- 创建BeanFactory类。
- 创建Reader类并回调配置给我们创建的BeanFactory类。
- 用这个Reader类去加载我们的BeanDefinition
1.1.2 ApplicationContext
可以从类结构图里看到Application不仅继承了我们传统的BeanFactory设计线路,还继承了其他接口,这样使得ApplicationIOC容器的功能更加强大。有以下特点:
- 支持不同的信息源
- 访问资源,这一特性体现在我们的Resouce和ResourceReader上,这样我们可以从不同的地方得到BeanDefinition
- 支持应用事件。这些事件和Bean生命周期的结合为管理Bean提供了便利。
关于Bean的载入和依赖注入其实两个不同的过程,Bean的载入一般分为三个过程:1.BeanDefinition的定位2.Bean信息的载入(将具体POJO对象抽象为Bean内部数据结构的过程)3.Bean信息的注册(IOC内部会维护一个hashmap去存储这些Bean信息)。而我们的依赖注入也就是我们所谓的DI,这里注意关于IOC和DI你可以将IOC理解成一种设计手段,而DI就是实现这种手段的一种方式 。我们的DI一般发生在我们应用首次调用该Bean的时候。当然有一种例外在Bean初始化的时候就发生依赖注入就是我们的懒加载机制。
这里结束就可以回答开头的问题,这两种设计路线的区别,从类结构图可以看到ApplicationContext已经继承了Reader类为我们提供了一系列加载不同Resource的读取器的实现。因此我们编程式中就不必为该类IOC容器声明Reader再进行回调配置了。
2.1 FileSystemXmlApplicationContext
那么ApplicationContext类IOC容器在何时配置的读取器,我们以FileSystemXmlApplicationContext为例:
关于这个读取器的配置我们可以在它的基类AbstractRefreshableApplicationContext中找到,我们都知道refresh的调用是在FileSystemXmlApplicationContext的构造函数中,这是IOC容器初始化的入口。在AbstractRefreshableApplicationContext中有一个抽象方法loadBeanDefinitions(DefaultListableBeanFactory var1),这个抽象方法在 AbstractXmlApplicationContext中有被实现其中就配置了Reader读取器。
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
this.initBeanDefinitionReader(beanDefinitionReader);
this.loadBeanDefinitions(beanDefinitionReader);
}
Spring技术内幕笔记2--我懒不写了哈哈哈哈。的更多相关文章
- 《spring技术内幕》读书笔记(1)——什么是POJO模式
今天在看<spring技术内幕>,第一章中多次提到了使用POJO来完成开发,就百度了一下,在此保留 1. 什么是POJO POJO的名称有多种,pure old java obje ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- Spring技术内幕:设计理念和整体架构概述(转)
程序员都很崇拜技术大神,很大一部分是因为他们发现和解决问题的能力,特别是线上出现紧急问题时,总是能够快速定位和解决. 一方面,他们有深厚的技术基础,对应用的技术知其所以然,另一方面,在采坑的过程中不断 ...
- Spring技术内幕:SpringIOC原理学习总结
前一段时候我把Spring技术内幕的关于IOC原理一章看完,感觉代码太多,不好掌握,我特意又各方搜集了一些关于IOC原理的资料,特加深一下印象,以便真正掌握IOC的原理. IOC的思想是:Spring ...
- spring 技术内幕读书笔记1
1 在 java 应用开发中,往往会涉及复杂的对象耦合关系,在 代码中处理这些耦合关系,对代码的维护性和应用扩展性会带来许多不便.通过使用spring 的 IOC 容器,可以对这些耦合关系实现一个文本 ...
- 《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用
1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端 ...
- 《Spring技术内幕》读书笔记
简介: 1.spring 与unix.window这些操作在计算机系统中起到的作用是类似的 2.两大核心模块:IOC\AOP 3.为应用开发提供了许多现成的系统组件:事务处理.Web MV.JDBC. ...
- Spring技术内幕阅读笔记(一)
1.BeanFactory:实现ioc容器的最基本形式.String FACTORY_BEAN_PREFIX = "&";Object getBean(String var ...
- 《Spring技术内幕》笔记-第二章 IoC容器的实现
简单介绍 1,在Spring中,SpringIoC提供了一个主要的JavaBean容器.通过IoC模式管理依赖关系.并通过依赖注入和AOP切面增强了为JavaBean这样子的POJO提供事务管理,生命 ...
随机推荐
- Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...
- Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!
在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常? 注意:M ...
- Docker容器 关于镜像构建的安全问题
写在前面 确保容器中服务与应用安全是容器化演进的关键点.容器安全涉及到应用开发与维护的整个生命周期,本文主要从镜像构建的视角来看docker容器的一些安全问题及应对措施. 一.权限管理 1.避免以容器 ...
- 读《深入理解java虚拟机》小结
之所以学习 jvm ,是因为在学习多线程相关知识时,对 volatile 关键字理解的不够透彻,总有种似懂非懂的感觉.于是通过在网上各种资料的查阅,最终将 volatile 和 jvm 联系上了,本身 ...
- Ubuntu16.04 Linux 下安装、配置SSH
本人在Win7+VMware下利用两个ubuntu虚拟机安装.配置.测试了SSH. 在Server端安装openssh-server. sudo apt-get install ssh # 安装ssh ...
- MySQL大数据迁移备份
MySQL迁移通常使用的有三种方法: 1.数据库直接导出,拷贝文件到新服务器,在新服务器上导入. 2.使用第三方迁移工具. 3.数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL ...
- C语言中volatile、register、const、static、extern、 auto关键字的作用
一.volatile详解 volatile的本意是"易变的" 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据.当要求使用volat ...
- vue+element+echarts柱状图+列表
前端由vue+element搭建框架,引入vue和element的index.js和css就可以写页面: 页面和js可以echarts官网实例看下都是有的,主要看下如何动态赋值: 柱状图和列表: &l ...
- window 日志的查看与清理
日志查看: 启动Windows实验台,点击:开始 - 控制面板 - 管理工具 - 事件查看器.如下图所示. 2.在事件查看器中右键应用程序(或安全性.系统.DNS服务器)查看属性可以得到日志存放文件的 ...
- 使用GitHub Pages + docsify快速搭建一个站点
话不多说,先看效果: https://bytesfly.github.io/blog 为什么需要一个站点 肯定有人会问,既然有类似 博客园 这样优秀的平台来写博客,为什么还需要自己搭建站点呢? 放在G ...