47.Spring源码面试精辟解读

文章目录

前言

Spring框架是我们现在java后端使用最多的框架,SpringMvc->SpringBoot,而其中的源码面试也是我们经常面试中会被问的,如果没看过源码,没了解过源码总结,只会使用,那么面试基本就会挂掉。本篇文章谈谈我对Spring源码的总结,来帮助大家能够更好的搞定源码面试和对源码的理解来更好的提高工作效率。

1.Spring框架的优点和缺点:

1.1优点

1.2缺点:

2.Spring核心组件讲解:

Spirng总共有十几个组件,但是核心组件只有三个:Spring Core、Spring Context、Spring Beans,他们三相当于Spring的骨架,没有他们不可能有AOP、WEB等上层特性。
Spring就是面向Bean的编程,Bean在Spring中才是真正的主角。

Spring Bean: 就像是演员主演,包装的是Object,而Object必然有数据。

Spring Context:就是舞台背景,发现各种Bean的关系,并且维护好这种关系,就是维护Bean的关系集合,这种集合又叫IOC容器。

Spring core:是道具,Core就是建立起IOC容器和Bean之间关系的工具,叫Utils可能会更好理解。

3.Spring流程总结和常用注解:

SpringWeb的请求流程:

用户发送请求-》DispatcherServlet捕获到请求-》HandlerMapping进行映射到控制Controller-》HandlerAdapter进行映射到方法-》HttpMessageConveter-》返回数据(jsp界面/json等)-》返回到用户端结束流程

常用注解:

注解名称

说明

备注

@Controller

使用它标记的类就是一个SpringMVC Controller 对象


@RestController

使用它标记的类就是一个SpringMVC Controller 对象

用于SpringBoot直接返回json,其实就是@Controller和@ResponseBody组合

@RequestMapping

处理请求映射地址

可以注解在类上和方法上

@PostMapping

处理请求映射地址,post请求

只能注解在方法上

@GetMapping

处理请求映射地址,get请求

只能注解在方法上

@PathVariable

用于对应restful风格url中的参数,@RequestMapping(value="/happy/{dayid}") findPet(@PathVariable String dayid)

我用的不多

@RequestParam

将请求的参数绑定到方法中的参数上,@RequestParam(value = “name”, required = false) String name

我用的不多

@ResponseBody

将返回类型直接输入到http response body中

经常使用返回json,但是已经在@RestController集成

@RequestBody

方法参数直接被绑定到http request body中

接受json参数必备

@Component

标注为一个普通的bean

控制反转

@Service

标注服务类

控制反转

@Autowired

注入服务

依赖注入

@Resource

注入mapper资源文件

依赖注入

@Value

注入配置的值

依赖注入

@Configuration

代替配置文件,相当于beans

全局使用

@ComponentScan

配置扫描包

全局使用

@Scope

配置bean的生命周期

全局使用

4.SpringMvc和SpringBoot:

Spring中共涉及到9种设计模式和面试需要:

设计模式名称

面试形式

备注

工厂模式

描述清楚

比较重要

单例模式

描述清楚,手写代码

最重要

代理模式

描述清楚

两种代理:jdk:实现接口,没有实现接口:CGLIB代理

包装器模式

描述清楚


适配器模式

描述清楚


简单工厂模式

描述清楚


观察者模式

描述清楚


策略模式

描述清楚


模板方法模式

描述清楚


这里简单总结下为什么后面我们现在经常使用的是SpringBoot:SpringBoot约定大于配置、简化编码、简化监控、简化配置、简化部署(内嵌tomcat,直接配置文件修改属性)
其实这里想说的是理解SpringBoot和SpringMvc的区别最好的是了解SpringBoot的四大神器:auto-configuration、starters、cli、actuator。

通过四大神器的解读可以很好的理解为啥现在我们会更多的使用SpringBoot。

SpringBoot2.x中性能提升,在使用redis上底层由jedis更换为lettuce:

jedis:Bio模式,线程非安全。

lettuce:NIO模式,线程安全,但是内存开销会大点。

io模式说明:

模式

说明

备注

BIO

同步阻塞

一个连接一个线程,多线程,消耗最大

NIO

同步非阻塞

一个请求一个线程,多路复用

AIO

异步非阻塞

一个有效的请求一个线程,性能最好

5.Spring和mybatis的集成源码解读:

Spring的源码很多,面试官让你谈谈对源码的看源码的理解是很开放的话题,这里拿出来Mybatis来说是因为我们比较常用到。
我们使用的时候只提供了一个接口和sql,其余的只交给Mybatis解决,这里面是怎么实现的呢?就涉及到源码解读。

我就不贴图了,直接全文字进行讲讲,如果有兴趣的看完我的可以进行源码调试跟踪下。我们知道Spring是通过反射机制利用class的属性实现实例化Bean,这里面面要提两个比较重要的接口FactoryBean和BeanFactory,只有一个BeanFactory,所有的FactoryBean最后都会注册到BeanFactory之前Spring自身提供了70多个FactoryBean的实现,现在是泛型FactoryBean从Spring3.0开始。

回到正题,看Mybatis源码就会发现里面的MapperFactoryBean实现FactoryBean接口负责注册到BeanFactory当然也继承了SqlSessionDaoSupport 类,里面实现了Bean的getObject方法,再想想我们使用mybatis经常使用的扫描注解:@MapperScan(“mapper接口所在包”)两者相结合的话就可以动态的使用MapperFactoryBean拥有不同的MapperInterface class属性,从而有了可以跟数据库交互的类,当然里面的sqlsession的一些信息没解读,还有代理类:MapperProxyFactory,最后通过MapperProxy泛型代理执行里面的具体方法invoke完成具体的方法执行。

总结

上面就是整个我面试过程当中和自己看的Spring源码面试的相关的面试的总结,文字比较多,可能有些地方加上图会更好理解,但是上面的总结确实是干货,如果你能给面试官扯出来上面这些东西的话,这个环节都会过,如果你有问题想跟我交流,请关注公众号:Java时间屋 来信交流。

展开阅读全文

页面更新:2024-02-25

标签:源码   注解   精辟   线程   容器   组件   框架   缺点   优点   接口   流程   参数   模式   关系   代码   方法   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top