47.Spring源码面试怎么面?

前言

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

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

1.1优点
  • 降低了组件之间的耦合性,实现了软件各层的解耦
  • 服务管理很方便像是事务服务和消息服务
  • 容器支持单例模式设置
  • aop的切面对权限、监控、耗时、错误日志分析。日志更好的管理
  • 容器提供了很多辅助类,方便开发
  • 可以对主流框架进行支持
  • Spring属于低侵入式,代码污染度极低
  • 独立于各应用服务器
  • DI机制降低了业务对象替换的复杂性
  • 高度的开放,可以部分使用Spring框架功能。
1.2缺点:
  • Spring DI特性依赖反射,反射影响性能,需要执行的代码指令是纯代码的好几倍,但是随着Spring版本的升级,我觉得这部分开销还是可以忽略的
  • 中断了应用逻辑,代码不完整,但是这同样是解耦的优点
  • 会降低开发门槛,造成框架依赖度强,但是个人认为这些也是可以忽略不计的

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时间屋 来信交流。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值