Spring知识点总结(概念篇)

Spring的优点
①方便解耦,简化开发。通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。
②Spring支持声明式事务。在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
③Spring本身提供了对各种主流框架的支持。Spring提供了对各种优秀框架(如Struts,Hibernate、Hession、Quartz)等的直接支持。
④通过AOP编程,我们将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码。



什么是AOP
软件开发中,业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

我们把横切关注点模块化为特殊的类,这些类称为切面。这样有两个好处:①横切关注点集中在同一处,而不是分散在多出代码中。②系统真正的业务逻辑代码更简洁,他们只包含核心关注点。



AOP 的家庭成员

JoinPoint(连接点)在应用执行过程中能够插入切面的一个点,这个点可以是调用方法时、抛出异常时甚至是修改一个字段。

PointCut(切点),切点缩小切面所通知的连接点的范围,它的定义会匹配通知所要织入的一个或多个连接点。

Advice(通知),在切点干什么,指定在PointCut地方做什么事情(增强),打日志、执行缓存、处理异常等等。

Advisor/Aspect(切面),切面是切点和通知的结合。切点和通知共同定义了切面的全部内容——它是什么,在何时何处完成什么功能。

Proxy (代理),其不能算做AOP的家庭成员,更相当于一个管理部门,它管理 了AOP的如何融入OOP。之所以将其放在这里,是因为Aspect虽然是面向切面核心思想的重要组成部分,但其思想的践行者却是Proxy,也是实现AOP的难点与核心据在。我们常说的代理包括静态代理、动态代理和基于CGLib代理,关于代理的知识请自行学习。

Weaving织入): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。



适合使用AOP的场景
Authentication 权限
Error handling 错误处理
Lazy loading 懒加载
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Resource pooling 资源池
Synchronization 同步
Transactions 事务



什么是IoC
简单的说,对象之间的依赖关系可以通过把对象的依赖注入交给框架或IoC容器来完成。在Spring中的体现是,对象之间的相互依赖关系由IoC容器进行管理,并由IoC容器完成对象的注入。

Java 是一门面向对象的语言,在 Java 中 Everything is Object,我们的程序就是由若干对象组成的。当我们的项目越来越大,合作的开发者越来越多的时候,我们的类就会越来越多,类与类之间的引用就会成指数级的增长。如下图所示:





这样的工程简直就是灾难,如果我们引入IoC框架。由框架来维护类的生命周期和类之间的引用。我们的系统就会变成这样:




这个时候我们发现,我们类之间的关系都由 IoC 框架负责维,同时将类注入到需要的类中。也就是说类的使用者只负责使用,而不负责维护。把专业的事情交给专业的框架来完成。大大的减少开发的复杂度。



IoC容器的基本工作过程
  1. 1. 初始化 IoC 容器。
  2. 2. 读取配置文件。
  3. 3. 将配置文件转换为容器识别的数据结构(这个数据结构在Spring中叫做 BeanDefinition
  4. 4. 利用数据结构依次实例化相应的对象
  5. 5. 注入对象之间的依赖关系



SpringMVC与Struts2的区别
①Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,从这个特点来看,SpringMVC更容量使用RESTful API。

②SpringMVC的方法之间基本上独立,每个方法独享request和response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量。而Struts2虽然方法之间也是独立的,但其Action内的变量是共享的,这不会影响程序运行,却给我们编码读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。

③由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。

④SpringMVC的入口是servlet,而Struts2的入口是filter。

⑤SpringMVC开发效率和性能高于Struts2,几乎零配置,而使用Struts2时,需要频繁的配置XML文件。



SpringMVC工作原理 


上面的是springMVC的工作原理图:
1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet。

2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。

5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。

6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。




Spring中bean的作用域

单例(singleton)整个应用中,只创建一个bean实例。
原形(prototype)每次注入或通过Spring应用上下文获取时,都创建一个新的bean实例。
会话(session)在Web应用中,每次会话都创建一个bean实例。
请求(request)在Web应用中,每次请求都创建一个bean实例。


参考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章