2022java应届生面试总结spring篇
文章目录
- 2022java应届生面试总结spring篇
- 前言
- 一、Spring,Spring mvc,Spring boot,Spring cloud,alibaba 的区别
- 1.Spring
- 2.Spring mvc
- 3.Spring boot
- 3.Spring cloud
- 3.Spring cloud alibaba
- 二、spring 常用注解
- 1.@SpringBootApplication
- 1.@Component
- 2.@RestController
- 3.@Validated
- 4.@Service
- 5.@Autowired
- 6.@Resource
- 7.@Transactional
- 三、spring三级缓存解决循环依赖
- 四、spring 自动装配
- 五、什么是IOC
- 六、什么是DI
- 七、Spring的AOP理解
- AOP里面的几个名词的概念:
- 关系图:
- 八、BeanFactory和ApplicationContext有什么区别?
- 九、Spring中bean的作用域
- 十、Spring事务失效场景
- 十一、spring七种事务传播机制
前言
2022java应届生面试总结-spring篇
一、Spring,Spring mvc,Spring boot,Spring cloud,alibaba 的区别
1.Spring
spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc)、业务层(Ioc)、持久层(jdbcTemplate)等都提供了多种配置解决方案;
2.Spring mvc
spring mvc是spring基础之上的一个MVC框架,主要处理web开发的路径映射和视图渲染,属于spring框架中WEB层开发的一部分;
3.Spring boot
spring boot框架相对于spring mvc框架来说,更专注于开发微服务后台接口,不开发前端视图,同时遵循默认优于配置,简化了插件配置流程,不需要配置xml,相对spring mvc,大大简化了配置流程;
3.Spring cloud
Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
3.Spring cloud alibaba
二、spring 常用注解
1.@SpringBootApplication
@Configuration
这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
@EnableAutoConfiguration
能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
@ComponentScan
会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。
1.@Component
实现bean的注入
2.@RestController
@RestController=@ResponseBody+@Controller
3.@Validated
@Validated作用在类、方法和参数上,用于参数校验。
详细
4.@Service
声明为一个service组件
5.@Autowired
默认根据type查找,可以根据@Qualifier(“名称”):指定自动注入的id名称
6.@Resource
根据name查找
7.@Transactional
开启事务
三、spring三级缓存解决循环依赖
三级缓存,简单来说,A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B,B实例化的时候发现需要A,于是B先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了A然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A,B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中状态)然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并将A放到一级缓存中。
四、spring 自动装配
spring中提供了向Bean中自动注入依赖的功能,这个过程就是自动装配,当向bean中注入的内容非常多的时候,自动注入依赖的功能将极大的节省注入程序的时间。
- 基于xml文件的自动装配:byType(类型),byName(名称), constructor(根据构造函数)
- 基于注解的自动装配:@Autowired,@Resource,@Value
五、什么是IOC
IOC,Inversion of Control,控制反转,指将对象的控制权转移给Spring框架,由 Spring 来负责控制对象的生命周期(比如创建、销毁)和对象间的依赖关系。
六、什么是DI
IoC 的一个重点就是在程序运行时,动态的向某个对象提供它所需要的其他对象,这一点是通过DI(Dependency Injection,依赖注入)来实现的,即应用程序在运行时依赖 IoC 容器来动态注入对象所需要的外部依赖。而 Spring 的 DI 具体就是通过反射实现注入的,反射允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性
七、Spring的AOP理解
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。
AOP里面的几个名词的概念:
- 连接点(Join point):指程序运行过程中所执行的方法。在Spring AOP中,一个连接点总代表一个方法的执行。
- 切面(Aspect):被抽取出来的公共模块,可以用来会横切多个对象。Aspect切面可以看成 Pointcut切点 和 Advice通知的结合,一个切面可以由多个切点和通知组成。
- 切点(Pointcut):切点用于定义 要对哪些Join point进行拦截。
- 通知(Advice):指要在连接点(JoinPoint)上执行的动作,即增强的逻辑,比如权限校验和、日志记录等。通知有各种类型,包括Around、Before、After、Afterreturning、After throwing。
- 目标对象(Target):包含连接点的对象,也称作被通知(Advice)的对象。 由于SpringAOP是通过动态代理实现的,所以这个对象永远是一个代理对象。
- 织入(Weaving):通过动态代理,在目标对象(Target)的方法(即连接点Joinpoint)中执行增强逻辑(Advice)的过程。
- 引入(Introduction):添加额外的方法或者字段到被通知的类。Spring允许引入新的接口(以及对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
关系图:
八、BeanFactory和ApplicationContext有什么区别?
①BeanFactroy采用的是延迟加载形式来注入Bean的,只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。
②ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。
九、Spring中bean的作用域
- singleton:默认作用域,单例bean,每个容器中只有一个bean的实例。
- prototype:为每一个bean请求创建一个实例。
- request:为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
- session:与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例。
- global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在global-session中。
十、Spring事务失效场景
- 数据库引擎不支持事务,比如MyISAM
- 入口方法不是public,这一点由Spring的AOP特性决定的,理论上而言,不public也能切入,但spring可能是觉得private自己用的方法,应该自己控制,不应该用事务切进去吧)。另外private方法, final 方法 和 static 方法不能添加事务,加了也不生效。
- Spring事务管理默认只支持运行期异常进行回滚(至于为什么spring要这么设计:因为spring认为Checked的异常属于业务的,coder需要给出解决方案而不应该直接扔该框架)
- 没有启用事务和切面
- 类是否被正确代理
- 业务和事务要在同一个线程,否则事务也不生效。
- 默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。
十一、spring七种事务传播机制
1.REQUIRED (默认)(TransactionDefinition.PROPAGATION_REQUIRED)
支持当前事务,如果有事务就加入到当前事务,没有则会创建一个新的事务。
2.SUPPORTS (TransactionDefinition.PROPAGATION_SUPPORTS)
支持当前事务,如果有事务就加入到当前事务,如果没有事务的话,以非事务的方式执行。
3.MANDATORY(强制性的)(TransactionDefinition.PROPAGATION_MANDATORY)
支持当前事务,当前如果没有事务就抛出异常。
4.REQUIRES_NEW (TransactionDefinition.PROPAGATION_REQUIRES_NEW)
不管是否有事务,都会创建一个新事物,并挂起当前事务。
5.NOT_SUPPORTED (TransactionDefinition.PROPAGATION_NOT_SUPPORTED)
以非事务的方式执行,如果当前存在事务,就将当前事务挂起。
6.NEVER (TransactionDefinition.PROPAGATION_NEVER)
以非事务方式进行,如果存在事务则抛出异常
7.NESTED(嵌套) (TransactionDefinition.PROPAGATION_NESTED)
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,创建一个新的事务。