Spring简要总结

来源:互联网 发布:读写数据什么意思 编辑:程序博客网 时间:2024/06/17 11:47

为什么使用Spring

传统Java开发具有高度耦合性,类之间的依赖关系太强,改动一个地方往往牵扯很多类。Spring可以管理对象和对象之间的依赖关系,我们不需要自己建立对象,把这部分工作全部转交给容器完成,具有低耦合,对代码没有侵略性,对服务器没有依赖性特点的框架

Spring整个系列的最最核心的概念当属IoC, AOP,什么是IoC和AOP就不展开了,简而言之,将对象创建过程的职责赋予容器,通过容器管理对象的生老病死, 将对象创建过程从编译时延期到运行时,即通过配置进行加载,这样一来就解决了不用编译后期选择具体实现,其实就是面向对象的核心理念,针对接口编程。IoC开始就是个factory加上依赖管理罢了,这样一来,一个系统的创建过程就从原先的new改为配置组装,内部通过注入解决了依赖关系,只要满足接口协议即插即用。通过IoC, AOP事实上形成了一个套路,通过这个套路完成了系统的整合。

框架简介

Spring是一个轻量级Java框架,其核心思想就是DI(Dependency Injection,即依赖注入)和IoC(Inversion of Control,即控制反转)
Spring自身功能以及和其他框架结合的架构图:

Spring架构图

主点的几大模块:

  • Core Container:Core和Beans是整个框架的核心部分,提供基础的DI和IoC功能。Context建立在core和beans模块之上,从beans模块继承它的功能同时增加了国际化支持,如资源绑定等
  • AOP and instrumentation:Aop模块提供了面向切面编程的实现
  • Data Access/Integration:Data access顾名思义,是spring对数据层提供的支持,是功能比较丰富的模块。提供了包括JDBC,事物,ORM,JMS等一系列实现。
  • Web:Web模块主要提供面向web的一些实现,例如多文件上传,servlet监听器以及spring mvc方面的支持。

特点:

  • 轻量级:程序实现不是很复杂,代码不是很多,占用资源不是很多,没有侵入性
  • IOC(Inversion of Control 控制反转):对象创建责任的反转(重点,核心);
  • Aop(Aspect Oriented Programming):一种面向横切面编程的思想方式,可以进行功能性扩展,看前边的一篇转载的博客:
  • 容器:可以容纳对象,并且可以控制对象的生命周期

DI和IoC

  • 依赖注入:对于spring而言,将自己置身于spring的立场上去看,当调用方需要某一个类的时候我就为你提供这个类的实例,就是说spring负责将被依赖的这个对象赋值给调用方,那么就相当于我为调用方注入了这样的一个实例。从这方面来看是依赖注入
  • 控制反转:对于调用方来说,通常情况下是我主动的去创建的,也就是对于这个对象而言我是控制方,我有他产生与否的权力,但是,现在变了,现在变为spring来创建对象的实例,而我被动的接受,从这一点上看,是控制反转

如何实现:

  1. 读取标注或者配置文件,看看Boss依赖的是哪个BookingService,拿到类名
  2. 使用反射的API,基于类名实例化对应的对象实例
  3. 将对象实例,通过构造函数或者setter,传递给Boss

其中还有Bean的相关内容需要补充?????

AOP面向切片编程

“关注点分离”:将不同的问题交给不同的部分去解决,每部分专注于解决自己的问题——>分治

面向切面编程(Aspect Oriented Programming,AOP)其实就是一种关注点分离的技术。例如,在软件开发过程中除了关注于业务逻辑,还要写事务管理、缓存、日志等等通用化的功能,而且每个业务功能都要和这些业务功能混在一起。为了将业务功能的关注点和通用化功能的关注点分离开来,就出现了AOP技术。这些通用化功能的代码实现,对应的就是我们说的切面(Aspect)。

最终需要将切面织入Weave到业务功能中,通过三种方式:

  • 编译时织入:在代码编译时,把切面代码融合进来,生成完整功能的Java字节码,这就需要特殊的Java编译器了,AspectJ属于这一类
  • 类加载时织入:在Java字节码加载时,把切面的字节码融合进来,这就需要特殊的类加载器,AspectJ和AspectWerkz实现了类加载时织入
  • 运行时织入:在运行时,通过动态代理的方式,调用切面代码增强业务功能,Spring采用的正是这种方式。动态代理会有性能上的开销,但是好处就是不需要神马特殊的编译器和类加载器啦,按照写普通Java程序的方式来就行了!

Spring面向切面编程的细节:

  • 切面(Aspect):指的就是通用功能的代码实现,比如我们上面演示的时间记录切面,日志切面,它们都是普通的Java类
  • 目标对象(Target):要被织入切面的对象,一般是实现核心业务逻辑的代码
  • 切入点(Pointcut):定义通知应该切入到什么地方,Spring支持的切入点就是方法调用,切入点的定义可以使用正则表达式,用以描述什么类型的方法调用。@Pointcut就是用来定义切入点的。
  • 通知(Advice):切面是一个类,而通知就是类里的方法以及这个方法如何织入到目标方法的方式(用@AfterReturning@Around标注的方法),有五种方式:
    • 前置通知(Before)
    • 后置通知(AfterReturning)
    • 异常通知(AfterThrowing)
    • 最终通知(After)
    • 环绕通知(Around)
  • 织入(Weaving):AOP实现的过程,即将切面应用到目标对象,从而创建一个新的代理对象的过程,对于Spring来说,就是初始化Context中的对象时,完成织入操作。

Tip:
1. Spring是什么?讲一下Spring的由来、思想、特性
2. Spring都有哪些产品组成?每个产品的作用、特点、使用场景?
3. 我在工作中用到了Spring的哪些产品、哪些特性?怎么用的?为什么用?


参考:
Spring(一)——总体介绍
浅析Spring框架中的设计结构
Java之美[从菜鸟到高手演变]之spring框架初识
Spring的AOP原理

原创粉丝点击