Skip to content

Commit 1f25f57

Browse files
committed
modify spring
1 parent 994809e commit 1f25f57

11 files changed

+1710
-2804
lines changed

docs/java-web/Spring/Spring源码剖析1:Spring概述.md

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
# Table of Contents
2-
1+
# 目录
32
* [Spring是什么](#spring是什么)
43
* [Spring能帮我们做什么](#spring能帮我们做什么)
54
* [为何需要Spring](#为何需要spring)
65
* [为什么需要Spring及Spring的优点](#为什么需要spring及spring的优点)
76
* [如何学好Spring](#如何学好spring)
87

98

10-
原文出处: [张开涛](http://sishuok.com/forum/blogPost/list/0/2508.html)
9+
原文出处:[张开涛](http://sishuok.com/forum/blogPost/list/0/2508.html)
1110

1211
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
1312
> https://github.com/h2pl/Java-Tutorial
@@ -46,11 +45,11 @@ Spring框架除了帮我们管理对象及其依赖关系,还提供像通用
4645
## Spring能帮我们做什么
4746
Spring除了不能帮我们写业务逻辑,其余的几乎什么都能帮助我们简化开发:
4847

49-
 
48+
5049

5150
一、传统程序开发,创建对象及组装对象间依赖关系由我们在程序内部进行控制,这样会加大各个对象间的耦合,如果我们要修改对象间的依赖关系就必须修改源代码,重新编译、部署;而如果采用Spring,则由Spring根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可,无需重新编译。所以,Spring能帮我们根据配置文件创建及组装对象之间的依赖关系。
5251

53-
 
52+
5453

5554
二、当我们要进行一些日志记录、权限控制、性能统计等时,在传统应用程序当中我们可能在需要的对象或方法中进行,而且比如权限控制、性能统计大部分是重复的,这样代码中就存在大量重复代码,即使有人说我把通用部分提取出来,那必然存在调用还是存在重复,像性能统计我们可能只是在必要时才进行,在诊断完毕后要删除这些代码;还有日志记录,比如记录一些方法访问日志、数据访问日志等等,这些都会渗透到各个要访问方法中;
5655

@@ -59,29 +58,29 @@ Spring除了不能帮我们写业务逻辑,其余的几乎什么都能帮助
5958

6059
有人可能说了,我们可以使用“代理设计模式”或“包装器设计模式”,你可以使用这些,但还是需要通过编程方式来创建代理对象,还是要耦合这些代理对象,而采用Spring 面向切面编程能提供一种更好的方式来完成上述功能,一般通过配置方式,而且不需要在现有代码中添加任何额外代码,现有代码专注业务逻辑。
6160

62-
所以,Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
61+
所以,Spring面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
62+
6363

64-
 
6564

6665
三、在传统应用程序当中,我们如何来完成数据库事务管理?需要一系列“获取连接,执行SQL,提交或回滚事务,关闭连接”,而且还要保证在最后一定要关闭连接,多么可怕的事情,而且也很无聊;如果采用Spring,我们只需获取连接,执行SQL,其他的都交给Spring来管理了,简单吧。所以,Spring能非常简单的帮我们管理数据库事务。
6766

68-
 
67+
6968

7069
四、Spring还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板,来方便数据库访问。
7170

72-
 
71+
7372

7473
五、Spring还提供与第三方Web(如Struts、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。
7574

76-
 
75+
7776

7877
六、Spring能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。
7978

80-
 
79+
8180

8281
Spring能帮我们做这么多事情,提供这么多功能和与那么多主流技术整合,而且是帮我们做了开发中比较头疼和困难的事情,那可能有人会问,难道只有Spring这一个框架,没有其他选择?当然有,比如EJB需要依赖应用服务器、开发效率低、在开发中小型项目是宰鸡拿牛刀,虽然发展到现在EJB比较好用了,但还是比较笨重还需要依赖应用服务器等。那为何需要使用Spring,而不是其他框架呢?让我们接着往下看。
8382

84-
 
83+
8584
## 为何需要Spring
8685
一 首先阐述几个概念
8786

@@ -101,15 +100,15 @@ Spring能帮我们做这么多事情,提供这么多功能和与那么多主
101100

102101
8、Bean:一般指容器管理对象,在Spring中指Spring IoC容器管理对象。
103102

104-
 
103+
105104

106105
## 为什么需要Spring及Spring的优点
107106

108107
●非常轻量级的容器:以集中的、自动化的方式进行应用程序对象创建和装配,负责对象创建和装配,管理对象生命周期,能组合成复杂的应用程序。Spring容器是非侵入式的(不需要依赖任何Spring特定类),而且完全采用POJOs进行开发,使应用程序更容易测试、更容易管理。而且核心JAR包非常小,Spring3.0.5不到1M,而且不需要依赖任何应用服务器,可以部署在任何环境(Java SE或Java EE)。
109108

110109
●AOP:AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,提供从另一个角度来考虑程序结构以完善面向对象编程(相对于OOP),即可以通过在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能的一种技术。通俗点说就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中;比如安全,日记记录,这些都是通用的功能,我们可以把它们提取出来,然后在程序执行的合适地方织入这些代码并执行它们,从而完成需要的功能并复用了这些功能。
111110

112-
 简单的数据库事务管理:在使用数据库的应用程序当中,自己管理数据库事务是一项很让人头疼的事,而且很容易出现错误,Spring支持可插入的事务管理支持,而且无需JEE环境支持,通过Spring管理事务可以把我们从事务管理中解放出来来专注业务逻辑。
111+
●简单的数据库事务管理:在使用数据库的应用程序当中,自己管理数据库事务是一项很让人头疼的事,而且很容易出现错误,Spring支持可插入的事务管理支持,而且无需JEE环境支持,通过Spring管理事务可以把我们从事务管理中解放出来来专注业务逻辑。
113112

114113
●JDBC抽象及ORM框架支持:Spring使JDBC更加容易使用;提供DAO(数据访问对象)支持,非常方便集成第三方ORM框架,比如Hibernate等;并且完全支持Spring事务和使用Spring提供的一致的异常体系。
115114

@@ -125,3 +124,34 @@ Spring能帮助我们简化应用程序开发,帮助我们创建和组装对
125124
Spring核心是IoC容器,所以一定要透彻理解什么是IoC容器,以及如何配置及使用容器,其他所有技术都是基于容器实现的;
126125

127126
理解好IoC后,接下来是面向切面编程,首先还是明确概念,基本配置,最后是实现原理,接下来就是数据库事务管理,其实Spring管理事务是通过面向切面编程实现的,所以基础很重要,IoC容器和面向切面编程搞定后,其余都是基于这俩东西的实现,学起来就更加轻松了。要学好Spring不能急,一定要把基础打牢,基础牢固了,这就是磨刀不误砍柴工。
127+
128+
129+
## 微信公众号
130+
131+
### 个人公众号:黄小斜
132+
133+
黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。
134+
135+
作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得和程序人生,目前黄小斜的CSDN博客有百万+访问量,知乎粉丝2W+,全网已有10W+读者。
136+
137+
黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长!
138+
139+
**原创电子书:**
140+
关注公众号【黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》
141+
142+
**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。
143+
144+
**考研复习资料:**
145+
计算机考研大礼包,都是我自己考研复习时用的一些复习资料,包括公共课和专业的复习视频,这里也推荐给大家,关注公众号后,后台回复关键字 **“考研”** 即可免费获取。
146+
147+
![](https://img-blog.csdnimg.cn/20190829222750556.jpg)
148+
149+
150+
### 技术公众号:Java技术江湖
151+
152+
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
153+
154+
**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。
155+
156+
![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg)
157+

docs/java-web/Spring/Spring源码剖析2:初探SpringIOC核心流程.md

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
# Table of Contents
2-
3-
* [前言](#前言)
4-
* [准备](#准备)
5-
* [读取](#读取)
6-
* [解析](#解析)
7-
* [注册](#注册)
1+
# 目录
2+
* [前言](#前言)
3+
* [准备](#准备)
4+
* [读取](#读取)
5+
* [解析](#解析)
6+
* [注册](#注册)
87
* [注入依赖](#注入依赖)
98

109

1110
本文转载自互联网,侵删
1211

1312
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
13+
1414
> https://github.com/h2pl/Java-Tutorial
1515
1616
喜欢的话麻烦点下Star哈
1717

1818
文章将同步到我的个人博客:
19+
1920
> www.how2playlife.com
2021
2122
本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
@@ -42,7 +43,7 @@
4243

4344
大致单步跟了下Spring IOC的初始化过程,整个脉络很庞大,初始化的过程主要就是读取XML资源,并解析,最终注册到Bean Factory中:
4445

45-
[![](https://cloud.githubusercontent.com/assets/1736354/7897341/032179be-070b-11e5-9ecf-d7befc804e9d.png "flow")](https://cloud.githubusercontent.com/assets/1736354/7897341/032179be-070b-11e5-9ecf-d7befc804e9d.png "flow")
46+
[![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/032179be-070b-11e5-9ecf-d7befc804e9d.png "flow")](https://cloud.githubusercontent.com/assets/1736354/7897341/032179be-070b-11e5-9ecf-d7befc804e9d.png "flow")
4647

4748
在完成初始化的过程后,Bean们就在BeanFactory中蓄势以待地等调用了。下面通过一个具体的例子,来详细地学习一下初始化过程,例如当加载下面一个bean:
4849

@@ -58,7 +59,7 @@
5859
```
5960

6061
加载时需要读取、解析、注册bean,这个过程具体的调用栈如下所示:
61-
[![](https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png "load")](https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png "load")
62+
[![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/8a488060-06e6-11e5-9ad9-4ddd3375984f.png "load")](https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png "load")
6263

6364
下面对每一步的关键的代码进行详细分析:
6465

@@ -222,7 +223,7 @@ protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate d
222223

223224
## 解析
224225

225-
[![](https://cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png "process")](https://cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png "process")
226+
[![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png "process")](https://cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png "process")
226227

227228
处理每个Bean的元素
228229

@@ -352,7 +353,7 @@ public void registerBeanDefinition(String beanName, BeanDefinition beanDefinitio
352353

353354
理解了以上两个过程,我们就可以自己实现一个简单的Spring框架了。于是,我根据自己的理解实现了一个简单的IOC框架Simple Spring,有兴趣可以看看。
354355

355-
356+
356357

357358
注册过程中,最核心的一句就是:`this.beanDefinitionMap.put(beanName, beanDefinition)`,也就是说注册的实质就是以beanName为key,以beanDefinition为value,将其put到HashMap中。
358359

@@ -363,11 +364,11 @@ public void registerBeanDefinition(String beanName, BeanDefinition beanDefinitio
363364

364365
创建bean的实例
365366
创建bean的实例过程函数调用栈如下所示:
366-
[![](https://cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png "create_bean")](https://cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png "create_bean")
367+
[![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/cec01bcc-092f-11e5-81ad-88c285f33845.png "create_bean")](https://cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png "create_bean")
367368

368369
注入bean的属性
369370
注入bean的属性过程函数调用栈如下所示:
370-
[![](https://cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png "inject_property")](https://cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png "inject_property")
371+
[![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/db58350e-092f-11e5-82a4-caaf349291ea.png "inject_property")](https://cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png "inject_property")
371372

372373
在创建bean和注入bean的属性时,都是在doCreateBean函数中进行的,我们重点看下:
373374

@@ -405,3 +406,34 @@ protected Object doCreateBean(final String beanName, final RootBeanDefinition mb
405406

406407

407408

409+
## 微信公众号
410+
411+
### 个人公众号:黄小斜
412+
413+
黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。
414+
415+
作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得和程序人生,目前黄小斜的CSDN博客有百万+访问量,知乎粉丝2W+,全网已有10W+读者。
416+
417+
黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长!
418+
419+
**原创电子书:**
420+
关注公众号【黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》
421+
422+
**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。
423+
424+
**考研复习资料:**
425+
计算机考研大礼包,都是我自己考研复习时用的一些复习资料,包括公共课和专业的复习视频,这里也推荐给大家,关注公众号后,后台回复关键字 **“考研”** 即可免费获取。
426+
427+
![](https://img-blog.csdnimg.cn/20190829222750556.jpg)
428+
429+
430+
### 技术公众号:Java技术江湖
431+
432+
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
433+
434+
**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。
435+
436+
![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg)
437+
438+
439+

0 commit comments

Comments
 (0)