李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Spring知识总结(一)
Leefs
2020-03-07 PM
2857℃
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
工具
35
其它
25
GO
48
NLP
8
标签云
Stream流
并发线程
SpringCloudAlibaba
Spark Streaming
Sentinel
Zookeeper
Git
nginx
Tomcat
JavaWEB项目搭建
Http
散列
数据结构和算法
Spark Core
Spark SQL
Flume
Kubernetes
Flink
FileBeat
设计模式
Spring
高并发
CentOS
SQL练习题
Ubuntu
Filter
Nacos
Eclipse
Spark
Thymeleaf
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞