同系列面试题推荐——你的点赞、分享、收藏是对我们最大支持!!!
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的注解有哪些?
Annotaion | Package | Source |
---|---|---|
@Autowired | org.springframework.bean.factory | Spring 2.5+ |
@Resource | javax.annotation | Java JSR-250 |
@Inject | javax.inject | Java JSR-330 |
@Autowired
和@Resource
使用的比较多一些
7、注入Bean的方式有哪些?(DI)
- XML方式注入
- 通过构造方法注入Bean
- 通过set方法注入Bean
- 注解方式注入 @Component+@ComponentScan
- 实现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 为什么这么快?
-
Redis 基于内存,内存的访问速度是磁盘的上千倍;
-
Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用;
-
Redis 内置了多种优化过后的数据结构实现,性能非常高。
16、什么的缓存穿透
大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。
解决办法:
非法请求,对他进行一个校验,过滤非法值
给无效的key缓存一个null值
布隆过滤器
17、什么是缓存击穿
大量的热点数据在缓存中过期、但是还存储在数据库中,造成大量请求直接访问到数据库,给数据库带来巨大的压力。
解决办法:
逻辑过期
使用互斥锁,只有少数的请求能够访问到数据库中。
18、什么是缓存雪崩
缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。
解决办法:
redis集群
限流: 避免同时处理大量的请求。
给不同数据的可以添加随机的过期时间
19、共享session
如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。
20、分布式锁
先拿setnx来争抢锁,抢到之后,再⽤expire给锁加⼀个过期时间防⽌锁忘记了释放
21、Redis的持久化
持久化就是把内存的数据写到磁盘中去,防⽌服务宕机了内存数据丢失。
RDB(创建快照)和AOF(日志记录)
感谢您的浏览!!!