javaWeb面试题(2024简洁版)

同系列面试题推荐——你的点赞、分享、收藏是对我们最大支持!!!

JAVA 基础面试题2024(简洁版)-优快云博客

jvm基础面试题2024(简介版)-优快云博客

1、拦截器和过滤器的区别

(1) 执行顺序不同:

过滤器是servlet接受到请求之后,在调用Servlet之前执行的,拦截器是在程序调用Servlet之后,在controller调用之前运行的。

(2)配置方式不同

过滤器是在web.xml中进行配置,而拦截器是在spring文件中进行配置

(3)使用范围不同

过滤器依赖于Servlet容器,而拦截器不依赖,可以单独使用

(4)操作对象范围不同

过滤器只能操作response 和request,通常用于字符编码、跨域等问题进行过滤;

而拦截器可以操作request,response,handler,exception,modelAndView进行操作。相当于拦截器多了对SpringMVC组件的操控。通常用于权限控制,日志打印,参数校验等。

2、了解Spring吗,谈谈它的优缺点?

Spring 是⼀种轻量级开发框架,能够提⾼开发⼈员的开发效率以及系统的可维护性。 ⼀般说 Spring 框架指的都是 Spring Framework,它有很多模块,这些模块可以很⽅便地协助我们进⾏开发。包括核⼼容器、Web、AOP、消息和测试模块。

优点:

轻量级:Spring框架是轻量级的。(最基础的版本⼤约只有2MB。)

控制反转(IOC):通过控制反转技术,实现了解耦合。对象给出它们的依赖,⽽不是创建或查找依赖的对象。

⾯向切⾯(AOP):Spring⽀持⾯向切⾯的编程,并将应⽤程序业务逻辑与系统服务分离。

MVC框架:Spring的WEB框架是⼀个设计良好的web MVC框架,它为web框架提供了 ⼀个很棒的替代⽅案。

容器:Spring包含并管理对象的⽣命周期和配置。

事务管理:Spring提供了⼀个⼀致性的事务管理接口,可以收缩到本地事务,也可以扩 展到全局事务(JTA)。

异常处理:Spring提供了⽅便的API来将具体技术的异常(由JDBC、Hibernate或JDO 抛出)转换为⼀致的unchecked 异常

缺点:

集成复杂 :⽐如我们想要使⽤ MyBatis 或者 MongoDB的时候,我们要做很多⼯作不管使⽤配置⽅式也 好还是使⽤注解⽅式。

配置复杂 :在使⽤ Spring 的时候,我们更多可能是选择 XML 进⾏配置,但⽬前这种配置⽅式已不在流 ⾏。

构建和部署复杂 :启动 Spring 的 IOC 容器,是完全要依赖于第三⽅的 web 服务器。⾃⾝不能启动的

3、IOC和AOP

IOC(Inversion of Control:控制反转)是一种设计思想。将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理,由 IoC 容器完成对象的注入 ,我们需要对象的时候就直接从IOC容器获取就可以了。 使⽤ IoC,意味着将设计好的对象交给Spring 容器控制,⽽不是直接在对象内部控制,可以很好的实现解耦。

  • 控制:指的是对象创建(实例化、管理)的权力

  • 反转:控制权交给外部环境(Spring 框架、IoC 容器)

AOP:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于程序的可拓展性和可维护性。 在Spring中,AOP是通过代理模式来实现的,在创建Bean时为Bean生成一个代理对象,代理对象能够拦截指定方法的调用,并在执行前或执行后执行特定操作。

4、将一个类声明为 Bean 的注解有哪些?

  • @Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用该注解标注。

  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作也可以使用mybatis里面的mapper注解。

  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。

  • @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

5、@Component 和 @Bean 的区别是什么?

@Component用于标识普通的类,而@Bean在配置类中用于方法上面声明和配置Bean对象;

Spring通过启动类中的ComponentScan扫描注册为一个类,而@Bean是手动去定义个Bean; @Bean 告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。

@Bean注解比 @Component注解的自定义性更强,而且很多地方我们只能通过@Bean注解来注册 bean。比如当我们引用第三方库中的类需要装配到Spring容器时,则只能通过@Bean来实现。

6、注入Bean的注解有哪些?

AnnotaionPackageSource
@Autowiredorg.springframework.bean.factorySpring 2.5+
@Resourcejavax.annotationJava JSR-250
@Injectjavax.injectJava JSR-330

@Autowired@Resource使用的比较多一些

7、注入Bean的方式有哪些?(DI)

  1. XML方式注入
  2. 通过构造方法注入Bean
  3. 通过set方法注入Bean
  4. 注解方式注入 @Component+@ComponentScan
  5. 实现FactoryBean

8、@Autowired 和 @Resource 的区别是什么

  • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。

  • Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。当一个接口存在多个实现类的情况下,@Autowired可以采用 @Qualifie 按照名称进行匹配。

  • @Autowired 支持在构造函数、方法、字段和参数上使用。@Resource 主要用于字段和方法上的注入,不支持在构造函数或参数上使用。

9、Spring 管理事务的方式有几种?

  • 编程式事务:在代码中硬编码(不推荐使用)

  • 声明式事务:在 XML 配置文件中配置或者直接基于注解(推荐使用) : 实际是通过 AOP 实现(基于@Transactional 的全注解方式使用最多)

10、什么是SpringBoot?

它使⽤"习惯优于配置"的理念——项⽬中存在⼤量的配置,此外还内置⼀个习惯性配置,让你⽆需⼿动进⾏配置,也能很快创建和运行一和spring项目。比如有Maven目录结构、默认 application 配置文件、起步依赖。

优点:

快速构建项⽬

对主流开发框架的集成很方便

项⽬可独⽴运⾏,⽆需外部依赖Tamcat容器

极⼤地提⾼了开发,部署效率

11、什么是SpringBoot Starters(起步依赖)

spring Boot Starter解决的是依赖管理配置复杂的问题,有了它,很好的解决了jar包的管理问题。

12、SpringBoot自动配置原理是什么?

@SpringBootConfiguration:声明它是一个配置类

@ComponentScan:扫描被@Component (@Repository,@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。

@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制

里面有个@import注解,指定的是ImportSelector的实现类,这个类里面有个selectImports方法,返回的是一个String类型的数组。他将获取的是一些jar包下面的spring.factories,mate-INF/AutoConfiguration.imports文件

13、处理常见的 HTTP 请求类型

  • GET:请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)

  • POST:在服务器上创建一个新的资源。举个例子:POST /users(创建学生)

  • PUT:更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/12(更新编号为 12 的学生)

  • DELETE:从服务器删除特定的资源。举个例子:DELETE /users/12(删除编号为 12 的学生)

三、Redis

14、什么是Redis?

它是一个基于内存的、键值型的NoSql数据库。由于Redis的数据是存储在内存中,所以它的读写效率非常高,常用于缓存。为了满足不同的应用场景,Redis 内置了多种数据类型实现(比如 String、Hash、 List、Set、Zset)。并且,Redis 还支持事务、持久化、Lua 脚本等。

15、Redis 为什么这么快?

  1. Redis 基于内存,内存的访问速度是磁盘的上千倍;

  2. Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用;

  3. Redis 内置了多种优化过后的数据结构实现,性能非常高。

16、什么的缓存穿透

大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。

解决办法:

非法请求,对他进行一个校验,过滤非法值

给无效的key缓存一个null值

布隆过滤器

17、什么是缓存击穿

大量的热点数据在缓存中过期、但是还存储在数据库中,造成大量请求直接访问到数据库,给数据库带来巨大的压力。

解决办法:

逻辑过期

使用互斥锁,只有少数的请求能够访问到数据库中。

18、什么是缓存雪崩

缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。

解决办法:

redis集群

限流: 避免同时处理大量的请求。

给不同数据的可以添加随机的过期时间

19、共享session

如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。

20、分布式锁

先拿setnx来争抢锁,抢到之后,再⽤expire给锁加⼀个过期时间防⽌锁忘记了释放

21、Redis的持久化

持久化就是把内存的数据写到磁盘中去,防⽌服务宕机了内存数据丢失。

RDB(创建快照)和AOF(日志记录)

感谢您的浏览!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南巷旧人173

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值