前言
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还是存在大量的问题。
- 感觉有点滥用设计模式,一点点细节都好设计的非常大。
- 各种兼容性,追求大而全的方式。造成代码不可读,非常复杂。
- 很多代码历史久远,不断的扩张,没有对一些核心点进行优化,整合,重写,重构。
- 有些模块,设计得十分复杂。
- 一些代码没有开源,难受
- 开发环境搭建十分麻烦
教训
很久以前写了一个项目,里面什么框架都没有。持久成直接是用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 );
}
}
}
造成很大的开发工作量的同时,编程式事物扩展性分成不好,很容易忘记提交或者回滚,产生嵌套事物。开发,维护工作量提高,线上容易除问题
public void addUser(User user){
userMapper.addUser(user);
}
等等等等问题,之后引入了spring,一切都变得很简单了。只需要关注业务开发就行了。
解读的模块有
- spring-core
- spring-bean
- spring-aop
- spring-tx (对spring-tx的事物传播十分不感兴趣,所以这里不会解读)
- spring-context
- spring-jdbc(datasource子模块)
- spring-boot
这是基本依赖图
看完依赖图,贴上最简单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源码阅读前言与大纲