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、通知:

  实际被增强的逻辑部分代码,被称为通知;

  通知的多种类型:

  1. 前置通知(Before Advice): 在连接点之前执行的Advice,不过除非它抛出异常,否则没有能力中断执行流。使用 @Before 注解使用这个Advice。
  2. 返回之后通知(After Retuning Advice): 在连接点正常结束之后执行的Advice。例如,如果一个方法没有抛出异常正常返回。通过 @AfterReturning 关注使用它。
  3. 抛出(异常)后执行通知(After Throwing Advice): 如果一个方法通过抛出异常来退出的话,这个Advice就会被执行。通用 @AfterThrowing 注解来使用。
  4. 后置通知(After Advice): 无论连接点是通过什么方式退出的(正常返回或者抛出异常)都会执行在结束后执行这些Advice。通过 @After 注解使用。
  5. 围绕通知(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属性中定义;

  设置出现了哪些异常,不进行事务回滚;

posted @ 2021-06-22 20:31  DHaiLin  阅读(70)  评论(0编辑  收藏  举报