-
前言
-
1.Spring框架的优点和缺点:
-
2.Spring核心组件讲解:
-
3.Spring流程总结和常用注解:
-
4.SpringMvc和SpringBoot:
-
5.Spring和mybatis的集成源码解读:
-
总结
前言
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
回到正题,看Mybatis源码就会发现里面的MapperFactoryBean实现FactoryBean接口负责注册到BeanFactory当然也继承了SqlSessionDaoSupport 类,里面实现了Bean的getObject方法,再想想我们使用mybatis经常使用的扫描注解:@MapperScan(“mapper接口所在包”)两者相结合的话就可以动态的使用MapperFactoryBean拥有不同的MapperInterface class属性,从而有了可以跟数据库交互的类,当然里面的sqlsession的一些信息没解读,还有代理类:MapperProxyFactory,最后通过MapperProxy
总结
上面就是整个我面试过程当中和自己看的Spring源码面试的相关的面试的总结,文字比较多,可能有些地方加上图会更好理解,但是上面的总结确实是干货,如果你能给面试官扯出来上面这些东西的话,这个环节都会过,如果你有问题想跟我交流,请关注公众号:Java时间屋 来信交流。
原文始发于微信公众号(Java时间屋):Spring源码面试怎么面?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/251905.html