JAVA面试题口语总结 持续更新 (框架篇)

本文总结了JAVA面试中关于框架的常见问题,涵盖Spring的IOC/AOP概念,RabbitMQ的解耦原理,Spring MVC执行流程,Mybatis的#{}与${}区别,以及Spring Boot的跨域配置。同时讨论了Spring、Spring Boot和Spring Cloud的关系,服务注册和断路器的作用。

面试题 持续更新(框架篇)


1.Spring IOC/AOP

IOC:
控制反转,指程序中对象的获取方式发生了反转,本来是用new的方式创建的,转变为由第三方框架创建,降低了对象之间的耦合度。

比如有一天你在家里又饿又渴,想吃东西,那么你可以打开外卖软件,告诉他们你需要什么,然后他们就会帮忙送到家门口,大大简化了你下楼,查位置,打车过去,打车回来的操作,你只需要注册外卖软件的会员,然后告诉他们你想要什么,就可以了。

AOP:
面向切面编程,指将程序中重复的业务逻辑(比如安全,日志,事物等),封装成一个切面,然后注入到具体的业务逻辑中去。

比如一个银行系统中有取款流程和查询余额流程两个不同的流程,而这两个流程中有一个相同的验证用户的流程,那么我们可以吧验证用户的代码提取出来,不放到主流程中,赵另一个地方,写好验证用户的代码,然后告诉Spring你要把这段代码加到哪几个地方,Spring就会帮你加过去,而不需要自己Copy过去。


2.RabbitMQ是如何解耦的,应用场景有哪些

1.任务异步处理:
例如一个订单系统,用户点击完下单按钮,需要等待过久才能得到下单响应,处理速度慢,积压在系统中的请求就更多,占用的资源就越多,系统的吞吐量就越低
可以使用MQ提升系统的处理速度,提供用户体验。提升系统的吞吐量

2.应用程序解耦
为了解决消费者和生产者的耦合性,我加了个队列,生产者将数据,放到队列里面,消费者从队列里面取。
比如客户点击下单按钮,传统的做法我们订单成功之后,那么我们库存进行减少,此操作我们必须保证在一个事物里,这是一个原子操作,这样做在当今高并发的场景中并不使用,效率极其的低,并且应用系统之间耦合度较高。那么消息中间件可以解决我们这类的问题,我们首先将订单消息发送给mq的服务队列中,那么库存系统可以接受对应队列中进行消息处理,那么此时我们的应用系统之间并没有什么耦合联系,而都是通过相对应的队列进行消息的接收和处理,这样我们就可以将我们的系统之间的耦合度进行拆分,并且消息机制的异步处理机制可以提高我们的效率,并且集群的使用可以进行并发访问的处理等。

3.削峰填谷
假设平常时段我们的系统每秒最多可以处理1000个用户请求,但是某一时刻请求瞬间增多,每秒有5000甚至10000个请求访问系统,这个时候服务器承载不了就会导致服务器崩溃。
使用了 MQ 之后,限制消费消息的速度为1000,这样一来,高峰期产生的数据势必会被积压在 MQ 中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。


3.简述springmvc的执行流程

1.用户发送请求至前端控制器DispatcherServlet,该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问,并且会加载springmvc.xml配置文件。
2.前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在springmvc.xml中配置的或者注解的url与对应的处理类找到并进行存储,用map<url,handler>这样的方式来存储。
3.处理器映射器很久请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给前端控制器。
4.DispatcherServlet拿到Handler后,通过HandlerAdapter(处理器适配器)调用处理器。
5. 执行处理器(Controller,也叫后端控制器)。
6. Controller执行完成会返回一个ModelAndView对象给HandlerAdapter。
7. 通过HandlerAdapter将ModelAndView对象返回给前端控制器(DispatcherServlet)。
8. 前端控制器将ModelAndView传给视图解析器(ViewResolver)。
9. 视图解析器解析后返回具体View到前端控制器。
10. 前端控制器对View进行渲染视图。
11. 前端控制器响应客户。


4.mybatis中#{}与${}的区别。

#{}是预编译处理,$ {}是字符串替换。
Mybits在处理#{}时,会将sql中的#{}替换为?。比如打印出来的语句 select * from table where id = ? 。
Mybits在处理$ {}时,就是吧$ {}替换成变量的值。比如打印出来的语句 select * from table where id = 2 试试在在的参数。
使用#{}可以有效防止sql注入,提高系统安全性。


5.SpringMVC怎么样实现转发和重定向的?

请求转发是服务器内部的跳转
1.地址栏不发生变化
2.只有一个请求响应
3.可以通过request域传递数据

转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"

请求重定向是浏览器自动发起对跳转目标的请求
1.地址栏会发生变化
2.两次请求响应
3.无法通过request域传递对象

重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"


6.Spring的IOC你在项目中是怎么使用的?

IOC只要你用spring他就会用,IOC就是把对象的控制权交给spring,比如我们在spring中配置的<bean…>,之前没有spring我们只能new。


7.Spring Boot如何设置支持跨域请求?

可谓跨域:
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。
如何解决跨域:
只需要在controller类上添加注解@CrossOrigin即可。


8.Spring、Spring Boot和Spring Cloud的关系。

Spring:
Spring是一个生态体系(也可以说是技术体系),是集大成者,它包含了Spring Framework、Spring Boot、Spring Cloud等。

Spring Framework:
Spring Framework是整个spring生态的基石,为依赖注入、事务管理、WEB应用、数据访问等提供了核心的支持。

Spring Boot:
Spring Boot能够让你非常容易的创建一个单机版本、生产级别的基于spring framework的应用。然后,"just run"即可。Spring Boot默认集成了很多第三方包,以便你能以最小的代价开始一个项目。

Spring Cloud:
Spring Cloud事实上是一整套基于Spring Boot的微服务解决方案 。它为开发者提供了很多工具,用于快速构建分布式系统的一些通用模式,例如:配置管理、注册中心、服务发现、限流、网关、链路追踪等。


9.springboot 核心配置文件有哪几个,区别是什么?

Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
bootstrap (.yml 或者 .properties)
application (.yml 或者 .properties)
application文件主要用于Springboot自动化配置文件。


10.SpringBoot的核心注解是那个, 它由那几个注解组成?

.SpringBoot的核心注解是@SpringBootApplication由以下3个注解组成:
1.@SpringBootConfiguration:它组合了Configuration注解实现了 配置文件的功能。
2.@EnableAutoConfiguration:打开自动配置功能,也可以关闭某个指定的自动配置选项
如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
3.@ComponentScan:Spring扫描组件。


11.SpringCloud如何实现服务的注册?

服务在发布时,指定对应的服务名(服务名包括了IP地址和端口),将服务注册到注册中心(eureka或者zookeeper)。
这一过程是springcloud自动实现,只需要在main方法添加@EnableDisscoveryClient ,同一个服务修改端口就可以启动多个实。调用方法:传递服务名称通过注册中心获取所有的可用实例 通过负载均衡策略调用(ribbon和feign)对应的服务。


12.SpringCloud断路器作用。

当一个服务调用另一个服务由于网络原因或者自身原因出现问题时,调用者就会等待被调用者的响应,当更多的服务请求到这些资源时,导致更多的请求等待,这样就会发生连锁效应(雪崩效应),断路器就是解决这一问题。

完全打开状态:
一定时间内 达到一定的次数无法调用 并且多次检测没有恢复的迹象 断路器完全打开,那么下次请求就不会请求到该服务。

半开状态:
短时间内有恢复迹象,断路器会将部分请求发给该服务,当能正常调用时,断路器关闭。

关闭状态:
当服务一直处于正常状态,能正常调用,断路器关闭。.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值