Spring源码解读


spring框架有以下七个部分组成:

  • 核心容器
  • spring aop
  • spring 上下文
  • spring dao
  • spring orm
  • spring web模块
  • spring mvc框架

SpringPanel组件 spring的组件_Spring学习


核心容器


基本组件与功能

核心容器包括了:Beans、Core、Context、SpEL,它们的功能总体概括如下:

  • core和beans模块提供了整个框架最基础的部分,包括IoC(控制反转)和Dependency Injection(依赖注入)
  • Context建立在Core和Beans模块提供的基础之上:它提供了框架式访问对象的方式
  • core、beans、context构成了Spring框架
  • SpEL:提供了一种强大的用于在运行时操作对象的表达式语言

Spring与bean的关系

Spring容器是Spring的核心,一切SpringBean都存储在Spring容器内。可以说bean是spring核心中的核心。Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息来创建Bean实例,并调用Bean实例的方法来完成“依赖注入”,可以把Spring容器理解成一个大型工厂,Bean就是该工厂的产品,工厂(Spirng容器)里能生产出来什么样的产品(Bean),完全取决于配置文件中的配置。而这个配置是由开发人员创建和维护的。

Bean的作用域

spring的作用域有singleton,prototype,request,session,globle session。
这里只讨论常用的singleton和prototype两种作用域
对于singleton作用域,每次请求同id的Bean都将获得相同的实例,spring容器负责跟踪Bean实例状态,负责维护Bean实例的生命周期。对于prototype作用域,程序每次请求同id的Bean会获得新的实例,spring容器只负责创建,一旦创建成功就撒手不管,不再管理Bean实例的生命周期,也不会维护Bean实例的状态。

容器中Bean的生命周期

Spring可以管理singleton作用域Bean的生命周期,Spring可以精确地知道singleton域bean何时被创建,何时初始化完成,以及容器何时准备销毁Bean实例。对于singleton作用域的Bean,管理Bean的生命周期行为主要有两个时机:注入依赖关系后,销毁实例之前;具体的管理方法如下:
  Spring提供两种方式在Bean全部属性设置成功后执行特定行为
使用init-method 属性(代码污染小)
在类中编写一个方法,在属性中指定该方法在依赖关系设置完成后自动执行。
实现InitializingBean接口(耦合较高)
编写afterPropertiesSet()方法的具体实现
  同理,若在Bean销毁之前,执行特定的方法,只需要使用 destroy-method属性或实现DisposableBean接口(实现destroy()方法)
  对于prototype作用域的Bean,Spring容器只负责Bean的创建,当容器创建实例完成后,Bean将完全交给客户端代码管理,容器不再负责其生命周期,Spring容器本身也不知道自己创建了多少个实例,更无从知道这些实例什么时候才会被销毁。


spring aop


AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方
式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个
热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑
的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高
了开发的效率。编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面。web层->网关层->服务层-》数据层

XXXaware接口,让该接口意识到自己的名字能够看到,我们在实现了BeanNameAware的 User中,获取到了Spring容器中的BeanId(对应spring配置文件中的id属性),而没有实现BeanNameAware的User2,则不能获取到Spring容器中的Id属性。
相关概念:

  • Aspect(切面):Aspect声明类似于Java中的类声明,切面中会包含一下连接点和增强
  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用。对类成员的访问以及异常处理程序快的执行等等,自身还可以嵌套其他joint point
  • pointcut表示一组连接点,表示了具体增强要发生的地方
  • Advice:表示了 在切点程序要具体做的十五
  • tARGET 织入advice的对象
  • Weaving 将Aspect和其他对象连接起来,并创建Advice object的过程

SpringPanel组件 spring的组件_事务控制_02


spring 上下文


简简单单的Spring容器并不能为我们管理对象,必须要有应用上下文来提供对象配置才能在容器中进行对象管理。
ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件.


spring dao


对于原生的JDBC,需要我们每一次手动从数据库中去取连接。而Spring 的dao模式对此中方式进行了简化,一个dao模式应该包含以下几个模块:

  • 简单的类,包含属性值,且属性值对应数据表中的所有字段
  • Data Access Object 这是一个接口,接口中有对数据库进行操作的方法
  • dao接口的实现类:具体封装了对数据库的操作方法
  • service 具体提供服务

spring 事务管理


Spring的事务控制是属于Spring Dao模块的。
一般地,我们事务控制都是在service层做的。。为什么是在service层而不是在dao层呢??有没有这样的疑问…
service层是业务逻辑层,service的方法一旦执行成功,那么说明该功能没有出错。
一个service方法可能要调用dao层的多个方法…如果在dao层做事务控制的话,一个dao方法出错了,仅仅把事务回滚到当前dao的功能,这样是不合适的[因为我们的业务由多个dao方法组成]。如果没有出错,调用完dao方法就commit了事务,这也是不合适的(导致太多的commit操作)。
事务控制分为两种:

  • 编程式事务控制
  • 声明式事务控制

编程式事务控制

自己手动控制事务,就叫做编程式事务控制。
Jdbc代码:
Conn.setAutoCommite(false); // 设置手动控制事务
Hibernate代码:
Session.beginTransaction(); // 开启一个事务
细粒度的事务控制: 可以对指定的方法、指定的方法的某几行添加事务控制
(比较灵活,但开发起来比较繁琐: 每次都要开启、提交、回滚.)

声明式事务控制

Spring提供对事务的控制管理就叫做声明式事务控制
Spring提供了对事务控制的实现。
如果用户想要使用Spring的事务控制,只需要配置就行了。
当不用Spring事务的时候,直接移除就行了。
Spring的事务控制是基于AOP实现的。因此它的耦合度是非常低的。
粗粒度的事务控制: 只能给整个方法应用事务,不可以对方法的某几行应用事务。
(因为aop拦截的是方法。)
Spring给我们提供了事务的管理器类,事务管理器类又分为两种,因为JDBC的事务和Hibernate的事务是不一样的。
Spring声明式事务管理器类:
Jdbc技术:DataSourceTransactionManager
Hibernate技术:HibernateTransactionManager


spring orm


对象与关系数据库之间是不匹配,我们把这种不匹配称为阻抗失配,主要表现在:
-关系数据库首先不支持面向对象技术如继承、多态,如何使关系数据库支持它们;
-关系数据库是由表来存放数据,而面向对象使用对象来存放状态;其中表的列称为属性,而对象的属性就是属性,因此需要通过解决这种不匹配;
-如何将对象透明的持久化到关系数据库表中;
-如果一个对象存在横跨多个表的数据,应该如何为对象建模和映射。
其中这些阻抗失配只是其中的一小部分,比如还有如何将SQL集合函数结果集映射到对象,如何在对象中处理主键等。ORM框架就是用来解决这种阻抗失配,提供关系数据库的对象化支持。ORM框架不是万能的,同样符合80/20法则,应解决的最核心问题是如何在关系数据库表中的行和对象进行映射,并自动持久化对象到关系数据库。ORM解决方案适用于解决透明持久化、小结果集查询等;对于复杂查询,大结果集数据处理还是没有任何帮助的。

orm 表示对象关系映射,主要目的是实现面向对象编程里不同数据类型之间的相互转换。
它的三个原则是:

  • 简单:以最基本的形式建模数据
  • 传达性:数据库结构能够被任何人理解的语言文档化
  • 精确性:基于数据模型创建正确的标准化结构
    Spring对ORM的支持主要表现在以下方面:
  • 一致的异常体系结构,对第三方ORM框架抛出的专有异常进行包装,从而在使我们在Spring中只看到DataAccessException异常体系;
  • 一致的DAO抽象支持:提供类似与JdbcSupport的DAO支持类HibernateDaoSupport,使用HibernateTemplate模板类来简化常用操作,HibernateTemplate提供回调接口来支持复杂操作;
  • Spring事务管理:Spring对所有数据访问提供一致的事务管理,通过配置方式,简化事务管理。

spring web

Spring的Web模块用于整合Web框架,例如Struts1、Struts2、WebWork、JSF等。一个Web程序可能会同时用到多个框架如Struts、Hibernate,多个框架同时工作会增加程序的复杂性。而如果把这些工作交给Spring来统一管理,问题将会简单很多。如果由Spring统一管理各种框架,由Spring负责实例化,那么Spring就是一个小的容器。框架能够从Spring容器中获取各种资源,包括数据源、DAO对象、Service对象、事务管理者、拦截器等,并能使用Spring的特征如IOC、AOP等,这样程序将会变得相当灵活。这也是Spring框架得到广泛应用的原因。Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。


spring mvc


在早期 Java Web 的开发中,统一把显示层、控制层、数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,这样存在的弊端有:

  • JSP 和 Java Bean 之间严重耦合,Java 代码和 HTML 代码也耦合在了一起
  • 要求开发者不仅要掌握 Java ,还要有高超的前端水平
  • 前端和后端相互依赖,前端需要等待后端完成,后端也依赖前端完成,才能进行有效的测试
  • 代码难以复用

而mvc框架改善了那几点,传统的模型层被拆分为了业务层(Service)和数据访问层(DAO,Data Access Object)。 在 Service 下可以通过 Spring 的声明式事务操作数据访问层,而在业务层上还允许我们访问 NoSQL ,这样就能够满足异军突起的 NoSQL 的使用了,它可以大大提高互联网系统的性能。
特点:
结构松散,几乎可以在 Spring MVC 中使用各类视图松耦合,各个模块分离与 Spring 无缝集成。

e)和数据访问层(DAO,Data Access Object)。 在 Service 下可以通过 Spring 的声明式事务操作数据访问层,而在业务层上还允许我们访问 NoSQL ,这样就能够满足异军突起的 NoSQL 的使用了,它可以大大提高互联网系统的性能。
特点:
结构松散,几乎可以在 Spring MVC 中使用各类视图松耦合,各个模块分离与 Spring 无缝集成。