spring相关面试题
相关面试题
1、什么是spring?
Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
2、使用Spring框架的好处是什么?
- 轻量:Spring 是轻量的,基本的版本大约2MB。
- 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
- 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
- 容器:Spring 包含并管理应用中对象的生命周期和配置。
- MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
- 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
- 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
3、Spring由哪些模块组成?
简单可以分成6大模块:
- Core
- AOP
- ORM
- DAO
- Web
- Spring EE
4、什么是IOC?
控制反转,把对象的创建和对象之间的调用过程交给spring进行管理;
使用 Ioc 的目的:解耦(降低耦合度);
底层原理使用:xml解析、工厂模式、反射;
5、ioc的接口有哪些?
1、ioc思想基于ioc容器完成、ioc容器底层就是对象工厂;
2、spring提供了ioc容器的两种方式:(两个接口);
(1)、BeanFactory:ioc容器的基本实现,是spring内部的使用接口,不推荐开发人员进行使用;
在加载配置文件的时候不会创建对象、在获取(使用)对象的时候才会进行创建;
(2)、ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用;
在加载配置文件的时候会直接创建对象;
(3)、ApplicationContext接口的实现类;
6、有哪些不同类型的IOC(依赖注入)方式?
- 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
- Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。(建议使用)
7、解释不同方式的自动装配?
- no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
- byName:通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
- byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
- constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
- autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。
8、spring中有两种 bean,一种是普通 bean,另一种就是 FactoryBean?
普通bean:在配置文件中定义的类型就是返回的类型;
工厂bean:在配置文件中定义的类型可以和返回的类型不一样;返回的是一个 BeanFactory;
import org.springframework.beans.factory.FactoryBean; public class MyFactoryBean implements FactoryBean { //定义返回的Bean @Override public Object getObject() throws Exception { return new Stu(); } //定义返回的Bean的类型 @Override public Class<?> getObjectType() { return null; } //当前的Bean是否为单例 @Override public boolean isSingleton() { return false; } }
<!--定义的bean、返回是一个 FactoryBean--> <bean id="beanFactory" class="com.ithailin.interview.up.spring5.MyFactoryBean"> </bean>
9、ioc操作bean的生命周期?
1、通过构造器创建 bean 的实例(无参构造器);
2、为 bean 的属性设置值,和对其它 bean 的引用(调用 setter 方法);
调用后置处理器;postProcessBeforeInitialization
3、调用 bean 的初始化方法(需要进行配置初始化方法);
调用后置处理器;postProcessAfterInitialization
4、bean 可以进行使用了(对象获取到了);
5、当容器关闭的时候,调用 bean 的销毁方法(需要进行配置销毁的方法);
10、ioc中bean的作用域?
在spring中,可以在<bean>的scope属性设置bean的作用域,以决定这个bean是单实例的还是多实例的;
默认情况下,spring只为每个ioc容器声明的bean创建唯一一个实例,整个ioc容器范围内都能共享这个实例,所有后续的getBean()和bean的引用都将返回这个唯一的bean实例,该作用域被称为singleton,他是所有bean的默认作用域;
singleton:在ioc容器中存在一个bean实例,bean以单实例的方式存在;当ioc容器被创建时,实例化该bean;
prototype:当ioc容器被创建时,不会实例化该bean;每次调用getBean()时都会返回一个新的bean实例;
request:每次http请求都会返回一个新的bean实例,该作用域只适用于WebApplicationContext环境;
session:同一个http session共享一个bean实例,该作用域只适用于WebApplicationContext环境;
11、ioc容器初始化过程?
12、什么是aop?
面向切面编程,利用aop可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分直接的耦合度降低,提高程序的可重用性,同时提高了开发效率;
13、aop的底层原理?
1、有接口情况、使用 jdk 动态代理对象;
创建接口实现类代理对象,增强类的方法;
2、没有接口的情况、使用CGLIB动态代理;
创建子类的代理对象,增强类的方法
14、aop的专业术语?
1、连接点:
类里面哪些方法可以被增强,这些方法成为连接点;
2、切入点:
实际被真正增强的方法,称为切入点;
3、通知:
实际被增强的逻辑部分代码,被称为通知;
通知的多种类型:
- 前置通知(Before Advice): 在连接点之前执行的Advice,不过除非它抛出异常,否则没有能力中断执行流。使用
@Before
注解使用这个Advice。 - 返回之后通知(After Retuning Advice): 在连接点正常结束之后执行的Advice。例如,如果一个方法没有抛出异常正常返回。通过
@AfterReturning
关注使用它。 - 抛出(异常)后执行通知(After Throwing Advice): 如果一个方法通过抛出异常来退出的话,这个Advice就会被执行。通用
@AfterThrowing
注解来使用。 - 后置通知(After Advice): 无论连接点是通过什么方式退出的(正常返回或者抛出异常)都会执行在结束后执行这些Advice。通过
@After
注解使用。 - 围绕通知(Around Advice): 围绕连接点执行的Advice,就你一个方法调用。这是最强大的Advice。通过
@Around
注解使用。
4、切面:
把通知应用的切入点的过程,称为切面;
5、切入点表达式:
(1)、切入点表达式:知道对哪个类里面的哪个方法进行增强;
(2)、语法结构:
execution([权限修饰符][返回类型][类全路径][方法名称][参数列表])
6、有多个切面对同一个方法进行增强时,设置切面优先级;
(1)、在增强类上面添加注解 @Order(数字类型的值),数字越小、优先级越高
15、AOP的应用场景有哪些呢?
1、日志记录
2、权限验证
3、事务管理(spring 的事务就是用AOP实现的)
16、事务是什么?
是数据库操作最基本单元,要么都成功。如果有一个失败则都失败;
在Spring进行事务管理操作:
声明式事务:(推荐)
编程式事务:通过代码变成进行事务的提交或者回滚;
声明式事务管理:
注解:(推荐)
xml配置:
在Spring进行声明式事务管理,底层使用了 aop 原理;
事务管理器:
interface PlatformTransactionManager:事务管理器接口
class AbstractPlatformTransactionManager
class DataSourceTransactionManager
class JdbcTransactionManager
class RedissonTransactionManager
17、事务传播行为?
事务传播行为属性可以在注解@Transactional的propagation属性中定义;
当事务方法被另一个事务方法调用时,必须指定事务该如何传播;
例如:方法可能继续在现有的事务中运行,也有可能开启一个新的事务,并在自己的事务中运行;
事务的传播由传播属性来定义,spring定义了7种类型的传播行为;
REQUIRED:如果有事务在运行,当前方法就在这个事务内运行,否则就启动一个新事务,并在自己的事务内运行;
REQUIRES_NEW:当前方法必须启动一个新事务,并在自己的事务内运行,如果有事务正在运行,应该将它挂起;
SUPPORTS:如果有事务在运行,当前方法就在这个事务内运行,否则它可以不运行在事务中;
NOT_SUPPORTED:当前方法不应该运行在事务中,如果有事务正在运行,应该将它挂起;
MANDATORY:当前方法必须运行在事务中,如果没有事务正在运行,就抛出异常;
NEVER:当前方法不应该运行在事务中,如果有事务正在运行,就抛出异常;
NESTED:如果有事务在运行,当前方法就在这个事务的嵌套事务内运行,否则就启动一个新事务,并在自己的事务内运行;
18、事务的四大特性?
事务四大特性:ACID
- Atomicity(原子性):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用
- Consistency(一致性):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏
- Isolation(隔离性):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏
- Durability(持久性):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中
19、事务并发性问题?
假设有两个事务t1和t2并发执行;
1、脏读
t1将某条记录的age值从20修改到30;
t2读取到t1更新后的值30;
t1回滚,age值恢复为20;
t2读取到的值是一个无效的值;
2、不可重复读
t1读取age的值20
t2将age修改为30
t1再次读取age值为30,和第一次值不一致
3、幻读
t1读取表中一部分数据
t2向表中插入一条新数据
t1再次读取时,多出了一条新数据
20、如何解决事务的并发性问题?
事务的隔离级别可以在注解@Transactional的isolation属性中定义;
数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。
一个事务与其它事务隔离的程度称为隔离级别。
SQL标准中规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据数据一致性就越好,但并发性就越弱。
1、读未提交:READ UNCOMMITTED
允许t1读取t2未提交的数据;
2、读已提交:READ COMMITTED(Oracle默认隔离级别,开发时通常使用的隔离级别)
要求t1只能读取t2已提交的数据;
3、可重复读:REPEATABLE READ(MySql默认隔离级别)
确保t1可以多次从一个字段中读取相同的值,即t1执行期间,禁止其它事务对这个值进行更新;
4、串行化:SERIALIZABLE
确保t1可以多次从一个表中读取到相同的行,在t1执行期间,禁止其它事务对这个表进行新增、删除、修改操作,可以避免任何并发问题,但性能较差;
21、谈谈事务其它的属性?
事务超时时间
事务超时时间可以在注解@Transactional的timeout属性中定义;
事务需要在一定的时间内进行提交,如果不提交则进行回滚;
默认值 -1:代表不超时;
是否只读
事务是否只读属性在注解@Transactional的readOnly属性中定义;
读:查询操作;
写:增删改操作;
默认值:false;
事务回滚
事务回滚属性在注解@Transactional的rollbackFor属性中定义;
设置出现了哪些异常,会进行事务的回滚;
事务不回滚
事务不回滚属性在注解@Transactional的noRollbackFor属性中定义;
设置出现了哪些异常,不进行事务回滚;