前言
- 大家好,这里是IT学习日记,相信大家对今年IT的行情应该也有所了解了,从大厂到小厂,各种裁员消息。公司裁员我们无法决定,我们能做的就是不断提升自己,提前准备。
- 本系列文章主要分享了之前博主真实面试中遇到的一些问题,希望能够帮助准备就业或者跳槽的朋友。
一: 你可以简单描述下SpringMvc的执行流程吗
1、前端控制器(DispatchServlet)接收到客户端发送的请求
2、收到请求后它会转发给处理器映射器(HandlerMapping),请求获取Handler。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象和处理器拦截器(如果有),然后一并返回给DispatcherServlet。
4、前端控制器请求返回的处理器对象转发给处理器适配器(HandlerAdapter)
5、处理器适配器通过适配处理调用具体的处理器(Handler)既执行实际的后端逻辑处理代码,生成结果。
6、处理器适配器将Handler执行的结果ModelAndView返回给前端控制器
7、前端控制器将返回的ModelAndView转发给ViewResolver解析成View,并将View对象返回给前端控制器。
8、前端控制器接收到View对象然后转发给视图(一个接口,用于渲染视图)进行数据渲染。
9、前端控制器将处理结果响应给客户端
二: 说说你使用SpringMVC时常用到的注解以及作用
1、Controller/Service/Repository/Component: 用于标识当前类属于控制层/业务层/数据层/泛指组件(通用),被标记的类会被Spring容器进行管理。
2、RequestMapping: 请求地址映射,客户端请求映射路径可以到控制层,可以作用在或者方法中,当在类范围使用时,表示类中所有请求的父路径,当使用在某个方法时,表示当前方法的请求路径
3、RequestBody: 用于标记请求参数,被标记的参数会自动将请求的参数映射到符合条件的接受参数实体中
4、ResponseBody: 将反馈结果使用框架中对应的JSON框架转换成json字符串,可以使用在类或者方法中,当使用在类时,表示将类中所有的方法的反馈结果都转换成对应的JSON字符串,使用在方法时,表示将该方法的反馈结果转换成JSON字符串
5、RequestParam: 获取URL中携带的请求参数既URL中“?”后携带的参数,c传递参数的格式是:key=value
6、PathVariable: 用于获取URL中路径的参数值,参数名由RequestMapping注解请求路径时指定,常用语restful风格的api中,传递参数格式:直接在url后添加需要传递的值即可 如:/api/demo/1
7、Autowired: 自动装配,Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。当Spring找不到bean时会抛出异常,将@Autowired注解的required属性设置为false 不会抛出异常,会显示null
8、Resource: 类型填充,默认通过name属性去匹配bean,当找不到时再按type去匹配,当指定了name或者type则根据指定的类型去匹配bean,任何一个不匹配都报错
9、RestController: 实际上就是等于 Controller ResponseBody的作用
三: Spring Framework、Springboot和Springmvc有什么区别
一 详细:
1、Spring就是一个框架家族,它是为了解决企业应用开发的复杂性而创建的,由它衍生出了spring security、spring jpa、spring Cloud等产品,但是,这些产品的基础还是基于Spring框架中的IOC和AOP,IOC提高了依赖注入的容器,降低了对象间的耦合性,AOP提供了面向切面的编程,提高了代码的复用性,然后在两者的基础上实现了其他延伸产品的高级功能。
2、SpringMVC: 它提供了一种轻度耦合的方式来开发web应用。属于Sping家族中的一个模块,是一个web框架,通过前端控制器、处理器映射器、处理器适配器、视图解析器等使得开发web应用变得更容易。
3、SpringBoot: 它属于Spring家族中的一个子项目,是为了解决使用Spring项目开发时需要进行大量配置的问题,它并不是用于替换Spring框架的解决方案,而是依赖于Spring框架,集成了许多常用的第三方框架,遵循了"约定大于配置"的原则,让开发者则能够对主流的技术开箱即用,提升开发效率。
二: 总结
1、Spring实际上是一个框架家族,Spring Framework属于其中的一个子模块,基于IOC和AOP实现组件解耦
2、SpringBoot可以看做是一个整合工具,可以方便快速使用
3、SpringMVC是以Spring为基础,拓展出来的一个MVC包,提供了一种轻度耦合的方式来开发web应用。
四: 说说Spring Framework的一个体系结构和对应jar包的作用
一: Data Access模块相关jar包
1、Spring-JDBC: jdbc支持包
2、Spring-tx: 支持事务控制
3、Spring-orm: 对象映射关系,继承orm框架
4、Spring-oxm: 支持对象xml映射
5、Spring-jms: 支持对象消息服务
二: Web模块相关jar包
1、Spring-web: 基础的web功能
2、Spring-webmvc: 支持webmvc实现
3、Spring-webmvc-porlet: 基于porlet的mvc实现
4、Spring-structs: 集成structs,但spring4不再推荐
5、Spring-websocket: websocker支持(spring4),为web应用程序提高高效的通信工具。
6、Spring-mssaging: 支持构建消息的应用程序(Spring4支持)
三: AOP模块相关的jar包
1、Spring-AOP: 支持面向切面编程
2、Spring-Aspect: 集成Aspect,支持使用Aspect实现面向切面编程
3、Spring-instrument: 提供一些类级的工具支持以及classloader的实现
四: Core Container模块相关的jar包
1、Spring-core: 提供依赖注入DI和控制反转IOC的支持
2、Spring-beans: Bean工厂和bean的装配支持
3、Spring-context: Spring的上下文支持
4、Spring-Expression: 支持Spring表达式语言
五: Test模块相关的jar包
1、Spring-test: 提供junit和Mock测试功能
2、Spring-context-support: Spring的额外包支持如邮件服务
五: @Autowire和@Resource注解有什么区别
1、@Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false。
2、@Resource默认按名称装配,当找不到与名称匹配的bean时才按照类型进行装配。名称可以通过name属性指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,当注解写在setter方法上时,默认取属性名进行装配。
3、@Autowire和@Qualifier配合使用效果和@Resource一样
4、@Autowired是Spring的注解,@Resource是J2EE的注解,Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
六: @Resource装配顺序
1、如果同时指定name和type,则从容器中查找唯一匹配的bean装配,找不到则抛出异常
2、如果指定name属性,则从容器中查找名称匹配的bean装配,找不到则抛出异常
3、如果指定type属性,则从容器中查找类型唯一匹配的bean装配,找不到或者找到多个抛出 异常。
4、如果都不指定,则自动按照byName方式装配,如果没有匹配,则回退一个原始类型进行匹配,如果匹配则自动装配。
七: PathVariable、RequestParam、Param注解的区别
1、@RequestParam注解作用: 获取URL中携带的请求参数既URL中“?”后携带的参数,c传递参数的格式是:key=value
2、@PathVariable注解作用: 用于获取URL中路径的参数值,参数名由RequestMapping注解请求路径时指定,常用语restful风格的api中,传递参数格式:直接在url后添加需要传递的值即可
3、Param注解作用: 属于Mybatis框架中的注解,主要是用于绑定参数,可以指定对应的参数名称,然后可以在mapper.xml文件中使用绑定的名称来调用参数的属性。
八: Spring中事务的传播属性有哪些
一:定义
用于描述系统中存在多个事务,且事务之间存在嵌套调用(如A、B方法都开启了事务,但是在A方法中调用了B方法)时事务如何传播,它的传播行为是作用嵌套的方法中,如方法B嵌套中A中,传播行为则是作用在B方法中表示B事务的一些特性是有A决定的
事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。
二: 种类
PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
PROPAGATION_REQUIRES_NEW:总是主动开启事务;如果存在外层事务,就将外层事务挂起
PROPAGATION_SUPPORTS:如果不存在外层事务,就不开启事务;否则使用外层事务
PROPAGATION_NOT_SUPPORTED:总是不开启事务;如果存在外层事务,就将外层事务挂起
PROPAGATION_MANDATORY:如果不存在外层事务,就抛出异常;否则使用外层事务
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
PROPAGATION_NEVER:总是不开启事务;如果存在外层事务,则抛出异常
九: 注入容器的注解有哪些
1、Controller :用于标注表现层的组件
2、Service: 用于标注业务逻辑层的组件
3、Repository: 用于标注持久层的组件
4、Component: 可以使用在任意层级,表示通用的组件
5、Configuration: 表示是配置信息组件
6、Bean: 表示实体对象组件
十: 使用Springboot的优缺点
一: 优点
(1)能够快速创建基于 Spring 的应用程序、提高开发和部署效率。
(2)内置了tomcat、jetty等HTTP服务器,项目可以独立运行。
(3)提供了许多starter包,让 Maven 的配置变得简单。
(4)对主流框架无配置集成。
(5)提供了程序的运行时健康检查、监控等功能。
(6)可以完全不使用 XML 配置文件,采用注解配置。
(7)与云计算天然集成
二: 缺点
1、它只是Spring框架家族中的一个子项目,主要是用来提高开发和部署效率,提高生产力的,并没有如服务发现和服务注册功能,也没有配套的安全管控方案。
2、将传统的或者现有Spring Framework项目转为SpringBoot应用是比较困难和麻烦的,它更适用于全新的Spring项目。
小结
不积跬步,无以至千里;不积小流,无以成江海。今天播种努力的种子,总会有一天发芽!