转载 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系列之一:开篇相关推荐

  1. 深入理解Spring系列之六:bean初始化

    <深入理解Spring系列之四:BeanDefinition装载前奏曲>中提到,对于非延迟单例bean的初始化在finishBeanFactoryInitialization(beanFa ...

  2. 深入理解Spring系列之三:BeanFactory解析

    转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483824&idx=1&sn=9b7c2603093 ...

  3. 深入理解Spring系列之四:BeanDefinition装载前奏曲

    转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483835&idx=1&sn=276911368d4 ...

  4. 【手写系列】透彻理解Spring事务设计思想之手写实现

    事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Dura ...

  5. 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  6. Spring 系列: Spring 框架简介

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 在这篇由三部 ...

  7. 从需求的角度去理解Linux系列:总线、设备和驱动

    <从需求的角度去理解Linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文章,也是从需求的角度去理解Linux系统软件的开篇.这是作者精心撰写的经验总结,希望嵌 ...

  8. 深入理解Spring Redis的使用 (一)、Spring Redis基本使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  9. Spring 系列: Spring 框架

    第一部分:Spring 框架简介 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序 ...

最新文章

  1. 口罩巨头挑战“量子霸权”,3个月造出的『最强量子计算机』靠谱不?
  2. 基于动态背包的多场景广告序列投放算法
  3. jquery字符串转数组
  4. iOS与H5交互(WKWbebView)
  5. numpy基础笔记02
  6. 【推荐实践】推荐系统中模型训练及使用流程的标准化
  7. 关于msgpack序列化后的消息包是否再压缩
  8. wxWindows 最简单的Hello World程序
  9. 黑鲨重装计算机安装无法继续,一键重装失败不要怕,黑鲨教你解决一键重装系统失败问题...
  10. 国内优秀的PHP商城系统整理
  11. 汇编程序设计:钟表显示
  12. 微信小程序开发的一些注意事项记录
  13. java中字段可以取名is开头吗
  14. 吴恩达卷积神经网络 笔记,吴恩达 深度神经网络
  15. cv.WarpAffine函数M变换矩阵讲解
  16. stm32串口通信最后一字节不对异常
  17. 随笔-OC获取系统时间,获取绝对时间,获得真实时间
  18. 梁继璋:给儿子的一封信
  19. 日语 | 日本50音
  20. 蓝桥杯—交换瓶子—Java

热门文章

  1. 使用await实现多接口并行调用
  2. DNN结构演进History—CNN( 优化,LeNet, AlexNet )
  3. 从ReadImage到ML- 一个不错的博客
  4. 纹理特征:灰度共生矩阵
  5. 使用 yield 减少内存消耗
  6. QD75运动模块使用
  7. Python学习(3)变量类型
  8. DataContractJsonSerializer类
  9. Android 安全提示 笔记
  10. Python 生成器与列表解析