1.简述对Spring中IOC/DI的理解
IOC:控制反转,将创建和管理的对象的任务交给外部的Spring容器
DI:依赖注入,对象之间存在依赖关系,创建对象时,对其依赖的对应直接进行赋值
2.有哪些依赖注入的方式
基于注解
基于构造器
基于set方法
3.@Resource和@Autowired的区别
@Resource 会根据 bean 的名称进行注入。如果名称不存在,根据类型注入。
如果属性指定名称,只能根据名称注入
@Autowired 会按类型进行注入,如果一个接口有多个实现类,则需要配合 @Qualifier 注解来明确指定具体的 bean。
4.Spring bean如果出现循环依赖,如何解决
循环依赖,a中引用自身;a引用b,b引用a;a引用b,b引用c,c引用a
SpringBoot2.6.0之前,Spring内部有解决依赖的机制(三级缓存,不针对构造器注入)
2.6.0后,如果出现循环依赖,会报错,可以通过yml配置,开启支持循环依赖
不使用自带的三级缓存机制,也可以解决循环依赖,使用@Lazy(针对注解注入、构造器注入都可解决)
@Lazy****注解:使用@Lazy注解延迟加载依赖项,打破循环依赖。通过延迟初始化,避免了在创建Bean时直接依赖于尚未完成初始化的Bean。
使用@PostConstruct和@PreDestroy:将Bean的初始化和销毁逻辑放在这两个方法中,避免在构造函数中直接引用其他Bean,从而减少循环依赖的可能
5.简述对事务传播特性的理解
使用Spring事务的方法之间,互相调用时,事务如何传播
默认REQUIRED,如果两个方法都使用REQUIRED,进行事务合并,
若A报异常,A和B的数据都会回滚
如果一个方法A使用REQUIRED,另一个方法B使用REQUIRED_NEW,事务相互独立
若A报异常,A的数据会回滚,不会影响B
6.spring中,事务什么情况下会失效,以及如何解决
方法中的逻辑抛出异常后,在方法中捕获并处理异常
方法中抛出运行时异常,@Transactional(rollbackFor = Exception.class)
在同一类中,如果a方法没有事务,b方法使用事务,a直接调用b方法,b方法报错后,
b中数据不会回滚,注入自身的对象来调用b方法
事务传播行为不当;
确保所有需要事务支持的方法都使用正确的传播行为,例如 PROPAGATION_REQUIRED。
异步调用;
使用 @Async 注解时,确保事务上下文正确传递
7.简述spring bean对象的生命周期
Bean的实例化
给bean的属性进行赋值
把bean的实例化传递给bean的后置处理器的前置方法
如有@PostConstruct修饰的方法,会在初始化方法前执行
执行初始化方法
把bean的实例化传递给bean的后置处理器的后置方法
得到完整的bean对象,此时bean对象才能使用
销毁bean
8.@PostConstructor和@PreDestroy的作用
@PostConstruct:修饰Spring bean的初始化方法
@PreDestroy:修饰Spring bean的销毁方法
在 Bean 被销毁之前执行的方法。用于清理资源或执行清理操作,如关闭连接或释放占用的资源。
9.@RequestBody和@ResponseBody的作用
@RequestBody作用是将前端传来的json格式的数据转为自己定义好的javabean对象
@ResponseBody作用是将后端以return返回的javabean类型数据转为json类型数据
10.@DateTimeFormat和@JsonFormat的作用
@DateTimeFormat 针对json数据,将日期字符串转为日期对象
主要用于 Spring MVC 中的日期时间格式化,确保请求和响应中的日期时间数据格式正确。
@JsonFormat 针对json数据,实现日期字符串和日期对象的互相转换
JSON 数据序列化和反序列化过程中的日期时间格式化
11.@Value的作用
给对象的属性注入值,可以是常量值,也可以读取yml等配置文件中配置信息进行注入
12.@Configuration和@Bean的作用
@Configuration 修饰配置类,本质目的就是创建配置类的对象
用于定义配置类,它告诉 Spring 这个类包含一个或多个 @Bean 方法,这些方法将返回 Spring 容器中管理的 Bean 实例。
@Bean 修饰创建对象的方法,将创建的对象纳入Spring容器管理
它通常在 @Configuration 类中使用,用于创建和配置具体的 Bean 实例。
13.@PathVariable的作用
获取路径中的数据,将要赋值给控制器方法的参数
@GetMapping(“/user/{uid}”)
Public R userInfo(@PathVariable{“uid”} Integer id){}
绑定路径变量:将 URL 中的路径部分作为参数传递给控制器方法。
提取动态数据:通过 URL 中的路径变量来提取动态数据,如用户 ID、订单编号等。
14.Spring进行异常处理时,使用到的注解
@RestControllerAdvice 修饰全局异常类,返回json数据
@ExceptionHandler修饰处理异常的方法
@ResponseStatus
15.AOP底层实现的原理
反射+代理,Spring中有两种动态代理,jdk代理,cglib代理
Spring事务底层使用AOP技术实现
核心思想是在不修改现有代码的情况下添加新功能,从而降低代码间的耦合度。
16.AOP的通知类型 执行时机
前置通知 在目标方法调用之前
后置通知 在目标方法调用之后
环绕通知 在目标方法调用之前和之后
异常返回 在目标方法抛出异常之后
正常返回 在目标方法正常返回之后
17.Spring使用了哪些动态代理方式
jdk代理:Spring中针对实现接口的对象
cglib代理:针对任意对象,代理对象相当于目标对象的子类
18.SpringMVC的工作原理
19.拦截器包含的方法,及调用时机
preHandle() 访问目标控制器方法前
postHandle() 访问目标方法后渲染资源前
afterCompletion() 渲染资源后
20.过滤器和拦截器的区别
过滤器可以针对任意资源来进行过滤,包括静态资源(SpringMVC)
拦截器针对DispatchServlet匹配的资源进行拦截(SpringBoot)
21.SpringBean加载机制
Spring****上下文
配置元数据
Bean定义的读取
Bean的实例化
依赖注入
初始化回调
Bean的生命周期管理
单例和多例模式
BeanFactory与FactoryBean的区别 以及BeanFactory的理解
22.项目中使用了哪种日志框架
Logback SpringBoot自带的
Log4j
Log4j2
SLF4J 不是一个真正的日志实现,而是一个简单日志门面,可以让你的应用程序在部署时使用不同的日志框架。它通过绑定不同的日志实现来达到这个目的,比如 Logback 或 Log4j。
23.针对日志如何处理的?
我们项目中使用log4j2处理日志,日志存储到文件中或者日志存储es中,通过elk进行日志处理(其他方式,filebeat+kafka+elk/kafka+elk)后台提供页面可以查询日志,另外配置报警机制,报异常后,会有邮件或短信提醒
24.springboot实现自动装配的原理
@EnableAutoConfiguration扫描jar包中meta inf目录,有配置文件,里面存储的需要自动装配的类
25.你知道哪些安全框架?安全框架的主要作用是什么?
Spring Security/shiro/satoken
主要作用:认证和授权
认证:判断是否是合法用户
授权:认证后,判断用户是否有权限操作相应的功能
26.什么是rbac
基于角色访问控制
五表结构:用户表、角色表、权限表、用户角色对应关系表、角色和权限对应关系表
27.spring的核心功能有哪些
,有配置文件,里面存储的需要自动装配的类
25.你知道哪些安全框架?安全框架的主要作用是什么?
Spring Security/shiro/satoken
主要作用:认证和授权
认证:判断是否是合法用户
授权:认证后,判断用户是否有权限操作相应的功能
26.什么是rbac
基于角色访问控制
五表结构:用户表、角色表、权限表、用户角色对应关系表、角色和权限对应关系表
27.spring的核心功能有哪些
IOC、DI、AOP、事务、方便的整合第三方框架