经验整理-15--源码-核心知识-spring-mvc-springboot-100-主体汇总

---------servlet容器,web容器,spring容器,springmvc容器,dubbo容器之间区别---------

https://blog.csdn.net/u012060033/article/details/104953011/

在这里插入图片描述

----------SpringBoot和SpringMVC之间的区别----------

Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架 ;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

1)Spring MVC是Spring的一个模块,web模块。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等
2)Spring Boot实现了自动配置,降低了项目搭建的复杂度。用于快速、敏捷地开发集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),这些第三方库几乎可以零配置的开箱即用内置了Tomcat这类容器服务器,maven打出jar包直接跑起来

 

----------Spring----------

?为什么使用Spring? :
1:降低组件之间的耦合度,实现各层之间的解耦 
2:可以使用容器提供的众多服务。如: --事务管理服务 --JMS --Spring core核心服务 --持久化服务 
3:默认单例模式,节省内存(单例模式是懒汉式(饱汉式),线程安全--因为类加载的时候创建实例,不会多线程重复创建)
4:提供了AOP技术。实现如:事物、日志、权限拦截,运行监控等功能
5:提供了众多的辅助类。如JDBC Template,HIbernate Template
6:对主流的应用框架提供了集成支持。集成Struts,JPA,Hibernate。
7:缺点:目前不支持集群

----------Spring IOC----------

IOC容器,由spring来负责控制对象的生命周期,通过工厂模式+反射机制实现

    IOC(控制反转控,也叫做DI(Dependency Injection),中文意思叫容器依赖注入。)-------以Bean的方式来组织和管理Java应用中的各种组件,提供配置层次的解耦。所有的Bean都由Spring BeanFactory根据配置文件生成管理。ApplicationContext是BeanFactory的加强版继承类IOC管理生成Bean过程用的是工厂方法

IOC底层原理:
    3.工厂设计模式
    4.反射

   注意:scope="prototype"  作用范围 将单一bean的定义限制而在任意数量的对象实例

?IOC基于注解的主动装配?
(2)@Controller:web层
(3)@Service:service层
(4)@Repository:Dao层
@Autowired 标注成员变量时,不需要有set方法 
@Resource 默认按名称类匹配注入的,它是JDK提供的
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 <context:annotation-config/>元素。

Spring bean的生命周期 
bean的实例化: 
1:当作用域范围为singleton时,在初始化Spring容易的时候实例化bean实例。 
---1:如果lazy-init的值为true,则为延迟bean的实例化,即在Spring容器启动时不实例化bean的对象 
2:当作用域范围为prototype时,在调用Spring的getBean的方法时实例化bean对象
注入依赖对象可以采用手工装配或者自动装配,在实际应用中建议采用手工装配。因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

Spring Bean 作用域

Spring 中为 Bean 定义了 5 中作用域,分别为 singleton(单例)、prototype(原型)、request(请求)、session(会话) 和 global session(全局会话)

springbean的生命周期(会把不同的结构分配到不同的内存运行时数据区)

https://mp.csdn.net/console/editor/html/107178149  spring bean生命周期-子篇-自动-加载执行-随服务容器初始化加载的一些办法



Spring-bean的循环依赖以及解决方式

什么是循环依赖?

这里写图片描述
Spring中循环依赖场景有:
(1)构造器的循环依赖
(2)field属性的循环依赖

循环依赖如果不解决有什么后果(缺点)?

一、改动码影响别人
难以重构,我改动自已,会影响其他调用我的对象
二、循环依赖会导致内存溢出(栈溢出
比如,情况1:AB互相构造函数里创建对方对象,会在第一步实际化阶段,依次循环互相调对方的构造方法,直到栈溢出。(不依赖时,自已初始化完构造方法就出栈了)。
情况2:第二步属性赋值阶段,依赖注入对象引用,
AB互相依赖对象引用,依次循环互相调对方的构造方法,直到栈溢出。(不依赖时,自已初始化完构造方法就出栈了)。
 

怎么检测是否存在循环依赖

检测循环依赖相对比较容易,Bean在创建的时候可以给该Bean打标记,如果递归调用回来发现正在创建中的话,即说明了循环依赖了

Spring怎么解决循环依赖

一、构造器的循环依赖----
构造函数的参数上加上@Lazy注解,延迟加载。在注入依赖时,先注入代理对象,当首次使用时再创建对象完成注入

二、属性的循环依赖主要是通过3个map缓存来解决的----

Spring为了解决单例的循环依赖问题,使用了三级缓存
这三级缓存分别指:

singletonObjects(一级缓存):单例对象的cache
earlySingletonObjects(二级缓存):提前暴光的单例对象的Cache
singletonFactories(三级缓存) : 单例对象工厂的cache
依赖引用,
1)拿bean的时候先从singletonObjects(一级缓存)中获取;
如果一级获取不到,且对象正在创建中,就从earlySingletonObjects(二级缓存)中获取 (如果一级拿不到且非正在创建,那就是没bean,返回Null);
2)如果二级获取不到,且循环依赖标记为true,就从singletonFactories(三级缓存)中获取,然后将三级缓存的bean放到earlySingletonObjects(二级缓存)中,
并且将bean对应的singletonFactories(三级缓存)清除;
3)另外,等着正在创建中的bean初始化完毕后,会放到singletonObjects(一级缓存)中,earlySingletonObjects(二级缓存)的bean清除;
最终只会有一级缓存中有bean。
总结,bean落角点的顺序,三级至二级至一级。查找顺序是相反的


----------Spring AOP----------

    AOP:   面向切面编程,横切解决重复代码,AOP使用了两种代理方式,JDK动态代理和CGLIB代理,
事务管理,安全检查,缓存等。Spring并没有提供完整的AOP实现,Spring侧重于AOP实现与Spring IOC容器之间的整合,因此Spring AOP通常和Spring IOC一起使用。AOP使用了两种代理方式,JDK动态代理和CGLIB代理

jdk代理和cglib代理区别?

答1:
利用实现了实现InvocationHanlder的拦截器+反射机制生成一个实现了代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。(目标对象实现了接口,默认用它,也可强制使用CGLIB)
利用ASM开源包,把代理对象类的class文件加载进来,通过字节码技术修改class文件生成子类来处理(对象没有实现了接口,使用CGLIB)

静态代理,jdk动态和cglib动态区别?
静态代理是代理实现类;动态代理是代理接口;
jdk动态是利用反射机制;cglib动态是利用字节码来实现类进行代码;

----------Spring 事物----------

事物拦截器的实现原理。
spring中的事务管理是通过AOP代理来实现的,对被代理对象的每个方法进行拦截,
在方法执行前启动事务,方法执行完后根据是否有异常和异常的种类进行提交或回滚。

事务的四大特性:ACID
    原子性(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用 
    一致性(Consistency) 一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏
     隔离性(Isolation) 可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏 
    持久性(Durability) 一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中

?事物的两种实现方式?
手动控制事务,就叫做编程式事务控制
自动事物,Spring提供了对事务的管理, 这个就叫声明式事务管理,核心实现就是基于Aop

 

----------Spring MVC----------

SpringMVC工作原理?(结合DispatcherServlet源码而来)核心源码看过吗?

SpringMvc是spring的一个模块,基于MVC的一个框架,无需中间整合层来整合。https://blog.csdn.net/ywlmsm1224811/article/details/103250620
一、工作原理
1)客户端发送http请求给web服务器,web服务器对http请求url解析,如果url和web.xml中dispatcherServlet对应的请求url映射路径相匹配,则web服务器将请求转交给DispatcherServlet
2)DispatcherServlet接收到请求后根据请求的信息(包括请求URL、Http方法、请求报文头和请求参数Cookie等)和 HandlerMapping 中的映射配置找到处理请求的处理器 Handler
3)DispatcherServlet将处理权交给 Handler, 然后根据 Handler 和 handlerAdapters 找到对应的 HandlerAdapter
4)HandlerAdapter 对 Handler 进行具体的调用,处理http请求业务执行内容
5)Handler 对请求处理完成以后将返回一个 ModelAndView 对象给 DispatcherServlet,这个 ModelAndView 只是一个逻辑视图而不是一个真正意义上的视图--Handler处理器就是我们写的代码controller
6)DispatcherServlet 通过 ViewResolver 将 ModelAndView 转化为真正的视图 view
7)DispatcherServlet 调用 View 的 render 方法(传参是 ModelAndView 中 Model)渲染 View 并返回给客户端
从SpringMVC工作原理可知,主要的工作就是在 DispatcherServlet 完成的,下面学习一下 DispatcherServlet 源码
二、核心源码
SpringMVC 的核心处理逻辑在 DispatcherServlet 中,重点看了一下DispatcherServlet 的源码,并且通过debug 调试了源码。
https://blog.csdn.net/ywlmsm1224811/article/details/103250620

附:

对于spring-boot-starter-web内部是集成了spring-webmvc的即:provides: spring-webmvc,spring-web,jackson-databind

 

SpringMVC工作使用?

一、.主要是控制层controller

1. 两种返回路由映射值皆可

1.1返回标准的ModelAndView。
ModelAndView来封装数据和Jsp映射地址

1.2返回Jsp映射地址的String。
ModelAndView来封装数据

 

-----------springboot--------

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java_爱吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值