第一章 spring源码阅读前言与大纲

前言

spring 是一个优秀的企业级框架。它轻量,简单,完善,开放,包容,集成,与时俱进,创新。经过深刻的教训之后在老胡的业务项目里面,已经无法离开spring这个优秀的业务系框架了。

轻量

spring出道的时候是2003年,那个时候企业级解决方案只有sun公司的ejb2.0,ejb是一个庞大脓肿的企业级一站式解决方案。也许只需要一个很小的功能,但是需要把所有jar加入。而那个时候的spring只有bean,aop,tx与context。并没有jdbc与mvc。基本依赖加上就十来M。 spring集成了struts1,hibernate,直接替代了ejb,带来光明的曙光

简单

功能是复杂的,但是提供了简单的解决方案。比如依赖关联等等

完善,开放

spring对企业级基本开发支持十分完善。比如支持strtus2,hibernate,jms等等 在spring的设计与架构里面轻易扩展你想要的功能,基本每个核心的细节,都有扩展的方式

包容,集成,与时俱进

spring有良好的生态圈,对现在常用的技术,都做了健全支持。可以轻易的集成到项目里面

创新

spring-boot 集成式开发与运行框架。基本改变了现在的开发方式与运行方法。

对比

ejb4.0

ejb4.0 比ejb2.0要轻很多,但是社区力量十分薄弱。

jfinal

jfinal对其他技术的支持非常弱。比较适合较小,不需要扩展的项目

缺点

spring有很多有点,解决了很多问题,使用了大量的设计模式。阅读玩源码之后,自我感觉,spring还是存在大量的问题。

  1. 感觉有点滥用设计模式,一点点细节都好设计的非常大。
  2. 各种兼容性,追求大而全的方式。造成代码不可读,非常复杂。
  3. 很多代码历史久远,不断的扩张,没有对一些核心点进行优化,整合,重写,重构。
  4. 有些模块,设计得十分复杂。
  5. 一些代码没有开源,难受
  6. 开发环境搭建十分麻烦

教训

很久以前写了一个项目,里面什么框架都没有。持久成直接是用jdbc,编程式事物。代码里面大量的

public void addUser(User user){
		DruidPooledConnection conn = null;
		PreparedStatement ps = null;
		try {
			conn = druidDataSource.getConnection( );
			conn.setAutoCommit( false );
			ps = conn.prepareStatement( "** ")
			conn.commit( );
		}catch ( Exception e ) {
			try {
				conn.rollback( );
				log.error( e.getMessage( )  , e  );
			} catch ( SQLException e1 ) {
				log.error( e1.getMessage( ) , e );
			}
		}finally{
			try {
				conn.recycle( );
				if(ps != null){
					ps.close( );
				}
			} catch ( SQLException e ) {
				log.error( e.getMessage( )  , e  );
			}
		}
}

造成很大的开发工作量的同时,编程式事物扩展性分成不好,很容易忘记提交或者回滚,产生嵌套事物。开发,维护工作量提高,线上容易除问题

扫描二维码关注公众号,回复: 316234 查看本文章
public void addUser(User user){
	userMapper.addUser(user);
}

等等等等问题,之后引入了spring,一切都变得很简单了。只需要关注业务开发就行了。

解读的模块有

  1. spring-core
  2. spring-bean
  3. spring-aop
  4. spring-tx (对spring-tx的事物传播十分不感兴趣,所以这里不会解读)
  5. spring-context
  6. spring-jdbc(datasource子模块)
  7. spring-boot

这是基本依赖图 spring模块依赖图

看完依赖图,贴上最简单maven dependency配置

<properties>
		<spring-version>.....</spring-version>
		<spring-boot-version>.....</spring-boot-version>
</properties>
<dependencies>
	<!-- 最低依赖,可以用分布式生产者 -->
	<dependency>
	  <groupId>org.springframework</groupId>
	  <artifactId>spring-context-support</artifactId>
	  <version>${spring-version}</version>
	</dependency>
	<!-- spring 集成 其他mvc框架,最低依赖 -->
	<dependency>
	  <groupId>org.springframework</groupId>
	  <artifactId>spring-web</artifactId>
	  <version>${spring-version}</version>
	</dependency>
	<!-- spring mvc 最低依赖。-->
	<dependency>
	  <groupId>org.springframework</groupId>
	  <artifactId>spring-webmvc</artifactId>
	  <version>${spring-version}</version>
	</dependency>

	<!-- spring boot 最低依赖 -->
	<dependency>
	  <groupId>org.springframework.boot</groupId>
	  <artifactId>spring-boot-actuator</artifactId>
	  <version>${spring-boot-version}</version>
	</dependency>
	<dependency>
	  <groupId>org.springframework.boot</groupId>
	  <artifactId>spring-boot-starter</artifactId>
	  <version>${spring-boot-version}</version>
	</dependency>
	
	<!-- spring bott 最简单,脑残的依赖方式 想用什么 就继承什么 -->
	<parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starters</artifactId>
           <version>${spring-boot-version}</version>
        </parent>
</dependencies>
解读源码选择

本系列源码解读只讲述spring核心的模块。抓住核心,抓住重点,一层层的分析,剖析出来。剖析完之后,发现spring真的没有多少东西。 对一些兼容,支持,扩张的模块不会解读。 对已经过时的技术点不会进行解读。比如xml的相关技术 对一些很少用的技术与支持不接解读 如果对核心模块深入了解,其他模块就相对容易很多了。

目录

第一章 spring源码阅读前言与大纲

猜你喜欢

转载自my.oschina.net/u/1261452/blog/1635774