李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Spring知识总结(一)
Leefs
2020-03-07 PM
1260℃
0条
# Spring知识总结(一) **1. 什么是Spring?** Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性。Spring框架的目标是使得Java EE应用程序的开发更加简捷,通过使用POJO为基础的编程模型促进良好的编程风格。 **2. Spring有哪些优点?** **轻量级:**Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。 **控制反转(IOC):**Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。 **面向切面编程(AOP):** Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。 **容器:**Spring包含并管理应用程序对象的配置及生命周期。 **MVC框架:**Spring的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。 **事务管理**:Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口。 **异常处理:**Spring提供一个方便的API将特定技术的异常(由JDBC, Hibernate, 或JDO抛出)转化为一致的、Unchecked异常。 **3. Spring MVC运行流程** ![Spring知识总结(一)01.png][1] 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler( 可以根据xml配置、注解进行查找) 第三步:处理器映射器HandlerMapping向前端控制器返回Handler 第四步:前端控制器调用处理器适配器去执行Handler 第五步:处理器适配器去执行Handler 第六步:Handler执行完成给适配器返回ModelAndView 第七步:处理器适配器向前端控制器返回ModelAndView(ModelAndView是springmvc框架的一个底层对象,包括Model和view) 第八步:前端控制器请求视图解析器去进行视图解析(根据逻辑视图名解析成真正的视图(jsp)) 第九步:视图解析器向前端控制器返回View 第十步:前端控制器进行视图渲染( 视图渲染将模型数据(在ModelAndView对象中)填充到request域) 第十一步:前端控制器向用户响应结果 **4. Spring的IOC理解** (1)IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并且容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。 **DI:**依赖注入,在程序运行期间,由外部容器动态地将依赖对象注入到组件中。简单定义就是当一个对象需要另一个对象时,可以把另一个对象注入到对象中去。 (2)IOC让对象的创建不用去new了,可以由Spring自动生产,使用Java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法。 (3)Spring的IOC有三种注入方式:构造器注入、setter方法注入、根据注解。 - **构造器依赖注入:**构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。 - **Setter方法注入:**Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。 **5. 谈谈对AOP理解?** aop面向切面编程,关键在于代理模式,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。动态代理可以减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。 Spring AOP中的动态代理主要有两种方式,`JDK动态代理`和`CGLIB动态代理` **6. Spring 框架中都用到了哪些设计模式?** - 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例; - 单例模式:Bean默认为单例模式。 - 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术; - 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。 - 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。 **7. Spring AOP和AspectJ AOP有什么区别?** Spring AOP是属于运行时增强,而AspectJ是编译时增强。Spring AOP基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)。 Spring AOP已经集成了AspectJ,AspectJ应该算得上是Java生态系统中最完整的AOP框架了。AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。 如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择AspectJ,它比SpringAOP快很多。 **8. Spring如何处理线程并发问题?** 在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。 ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。 ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。 **9. BeanFactory和ApplicationContext有什么区别?** ApplicationContext提供了一种解决文档信息的方法,一种加载文件资源的方式(如图片),他们可以向监听他们的beans发送消息。另外,容器或者容器中beans的操作,这些必须以bean工厂的编程方式处理的操作可以在应用上下文中以声明的方式处理。应用上下文实现了MessageSource,该接口用于获取本地消息,实际的实现是可选的。 相同点:两者都是通过xml配置文件加载bean,ApplicationContext和BeanFacotry相比,提供了更多的扩展功能。 不同点:BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext。 **10. spring aop的五种通知类型** **前置通知[Before advice]:**在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。 **正常返回通知[After returning advice]:**在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。 **异常返回通知[After throwing advice]:**在连接点抛出异常后执行。 **返回通知[After (finally) advice]:**在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。 **环绕通知[Around advice]:**环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。 [1]: https://lilinchao.com/usr/uploads/2020/03/589168672.png
标签:
Spring
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/695.html
上一篇
Java锁知识总结
下一篇
【转载】Java锁知识总结(二)
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
43
标签云
随笔
nginx
Jquery
Spark RDD
DataX
Tomcat
数据结构
MyBatis-Plus
Docker
数学
Hbase
MyBatis
容器深入研究
Java
数据结构和算法
GET和POST
Netty
JavaScript
队列
工具
ClickHouse
NIO
ajax
锁
RSA加解密
SpringCloud
JavaSE
Spark Core
Azkaban
Jenkins
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞