深入理解Spring系列之一:开篇
转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483810&idx=1&sn=a2df14fdb638c2c6f54176d2926519d2&scene=19#wechat_redirect
Spring 经过大神们的构思、编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的。源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧.
第一遍学习的时候,不用关注全部细节,不重要的代码可以先忽略掉,达到理解大体的架子及流程,避免第一次就陷入某个坑里出不来。
第二遍针对某个流程更深入的、有针对性的去分析学习,当然遇到某个实在过不去的坎可以标记,后面再思考,毕竟是别人设计的,有些不是那么容易理解,可以使用 google,次数多了,总会有收获!
首先,看一下 Spring 的最基本使用方式,直接看代码,
public class LoginService {public void login() {System.out.println("execute LoginService");}
}
public class LoginResource {private LoginService loginService;public LoginService getLoginService() {return loginService;}public void setLoginService(LoginService loginService) {this.loginService = loginService;}public void login() {loginService.login();}
}applicationgContext.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="loginService" name="loginService" class="spring.LoginService"/><bean id="loginResource" name="loginResource" class="spring.LoginResource"><property name="loginService" ref="loginService"/></bean>
</beans>public class TestClient {@Testpublic void test() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationgContext.xml");LoginResource loginResource = (LoginResource) applicationContext.getBean("loginResource");loginResource.login();}
}
复制代码
概括的描述一下 Spring 背后的操作,解析 applicationgContext.xml,将 xml 中定义的 bean(如 loginService 和 loginResource) 解析成 Spring 内部的 BeanDefinition,并以 beanName(如 loginService) 为 key,BeanDefinition(如 loginService 相应的 BeanDefinition) 为 value 存储到 DefaultListableBeanFactory 中的 beanDefinitionMap (其实就是一个 ConcurrentHashMap) 中,同时将 beanName 存入 beanDefinitionNames(List 类型) 中,然后遍历 beanDefinitionNames 中的 beanName,进行 bean 的实例化并填充属性,在实例化的过程中,如果有依赖没有被实例化将先实例化其依赖,然后实例化本身,实例化完成后将实例存入单例 bean 的缓存中,当调用 getBean 方法时,到单例 bean 的缓存中查找,如果找到并经过转换后返回这个实例 (如 LoginResource 的实例),之后就可以直接使用了。
深入理解Spring系列之一:开篇相关推荐
- 深入理解Spring系列之六:bean初始化
<深入理解Spring系列之四:BeanDefinition装载前奏曲>中提到,对于非延迟单例bean的初始化在finishBeanFactoryInitialization(beanFa ...
- 深入理解Spring系列之三:BeanFactory解析
转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483824&idx=1&sn=9b7c2603093 ...
- 深入理解Spring系列之四:BeanDefinition装载前奏曲
转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483835&idx=1&sn=276911368d4 ...
- 【手写系列】透彻理解Spring事务设计思想之手写实现
事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Dura ...
- 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
- Spring 系列: Spring 框架简介
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 在这篇由三部 ...
- 从需求的角度去理解Linux系列:总线、设备和驱动
<从需求的角度去理解Linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文章,也是从需求的角度去理解Linux系统软件的开篇.这是作者精心撰写的经验总结,希望嵌 ...
- 深入理解Spring Redis的使用 (一)、Spring Redis基本使用
关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...
- Spring 系列: Spring 框架
第一部分:Spring 框架简介 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序 ...
最新文章
- 口罩巨头挑战“量子霸权”,3个月造出的『最强量子计算机』靠谱不?
- 基于动态背包的多场景广告序列投放算法
- jquery字符串转数组
- iOS与H5交互(WKWbebView)
- numpy基础笔记02
- 【推荐实践】推荐系统中模型训练及使用流程的标准化
- 关于msgpack序列化后的消息包是否再压缩
- wxWindows 最简单的Hello World程序
- 黑鲨重装计算机安装无法继续,一键重装失败不要怕,黑鲨教你解决一键重装系统失败问题...
- 国内优秀的PHP商城系统整理
- 汇编程序设计:钟表显示
- 微信小程序开发的一些注意事项记录
- java中字段可以取名is开头吗
- 吴恩达卷积神经网络 笔记,吴恩达 深度神经网络
- cv.WarpAffine函数M变换矩阵讲解
- stm32串口通信最后一字节不对异常
- 随笔-OC获取系统时间,获取绝对时间,获得真实时间
- 梁继璋:给儿子的一封信
- 日语 | 日本50音
- 蓝桥杯—交换瓶子—Java