美文网首页读书
Java框架常见面试题-Spring

Java框架常见面试题-Spring

作者: 南门屋 | 来源:发表于2022-04-21 17:49 被阅读0次

    1.什么是spring

    Spring是一个开源的轻量级的IOC和AOP容器框架。Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性。
    spring优点
    1)spring属于低侵入式设计,代码的污染极低;
    2)spring的DI机制将对象的创建和依赖关系交由框架处理,减低组件的耦合性;
    3)Spring提供了AOP技术,支持将一些通用任务,如事务、日志进行集中式管理,从而提供更好的复用。
    4)spring对于主流的应用框架提供了集成支持。
    主要组成模块
    Spring Core:核心类库,提供IOC服务;
    Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
    Spring AOP:AOP服务;
    Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
    Spring ORM:对现有的ORM框架的支持;
    Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
    Spring MVC:提供面向Web应用的Model-View-Controller实现。·

    2.Spring 事务实现方式

    编程式事务管理:在代码中调用 commit()、rollback()等事务管理相关的方法,这种方式带来了很大的灵活性,但很难维护。
    声明式事务管理:将事务管理和业务代码分离。通过注解或者XML配置管理事务。

    spring事务的7种传播行为

    @Transactional(propagation=Propagation.REQUIRED)
    PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
    PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

    脏读、幻读、不可重复读的区别:

    出现情况:当我们多个事务同时执行的去操作同一个数据的时候容易导致脏读、不可重复读、幻读的情况产生。

    1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后使用了这个数据。

    2. 不可重复读 :在一个事务内两次读到的数据是不一样的,称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

    3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。

    事务的隔离级别

    数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
    Read uncommitted:读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )
    Read committed:读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。会出现不可重复读、幻读问题(锁定正在读取的行)
    Repeatable read:重复读,就是在开始读取数据(事务开启)时,不再允许修改操作,会出幻读(锁定所读取的所有行)。
    SERIALIZABLE :保证所有的情况不会发生(锁表)
    大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

    3.说一下Spring的IOC和AOP?

    Spring的核心就是控制反转(IoC)和面向切面(AOP)。
    IOC:控制反转,把对象的创建和依赖关系交给Spring容器进行管理,可以降低代码的耦合度。(举例-没有IOC,项目维护会出现什么问题)。
    AOP:面向切面编程,意思就是把一些通用的任务提取出来,比如日志系统,事务管理等,放在一起集中管理。(举例--没有AOP的时候怎么去开启事务)
    参考文档https://www.pianshen.com/article/58191034801/

    Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

    JDK代理:基于接口的代理,不支持类的代理。
    CGLIB:支持类的代理

    动态代理和静态代理的区别?

    1.静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
    2.动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中

    4.Spring框架中都用到了哪些设计模式

    工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
    单例模式:Bean默认为单例模式。
    代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
    模板:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
    观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知,如Spring中listener的实现--ApplicationListener。

    5.Spring Bean的作用域?(在配置xml文件里对Scope配置项进行声明)

    Spring IOC容器创建一个Bean实例时,可以为Bean指定实例的作用域,作用域包括singleton(单例模式)、prototype(原型模式)、request(HTTP请求)、session(会话)、global-session(全局会话)。
    ① singleton
    使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
    ② prototype
    使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
    ③ request
    该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
    ④ session
    该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
    ⑤ global-session
    该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

    7.Spring中Bean是线程安全的么?

    Spring框架并没有对单例bean进行任何多线程的封装处理。大多数情况bean都是没有可变状态的,所以也可以说Spring中Bean是线程安全的,比如Dao;如果bean有多种状态的话,需要考虑线程安全的话,可以把bean的作用域scope设置为prototype。

    8.Spring如何处理线程并发问题?

    可以使用ThreadLocal解决线程并发问题。
    ThreadLocal的是线程内部的数据储存类,通过它可以在指定的线程里面储存数据,储存完成以后只能由指定的线程才能访问到,其他线程无法访问。······可以说一下原理。

    9.Spring中bean的注入方式?

    1.set()注入(在xml里面通过property进行依赖注入)
    2.构造器注入。需要注意当构造方法传入的两参数是同类型的时候,需要用index或者type进行区分。
    3.静态工厂的方法注入。静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象
    4.实例工厂的方法注入。需要先new创建工厂类,再调用普通的实例方法

    10.简单说一下Spring Bean的声明周期?

    简单来说可以分为四个阶段:
    一阶段:创建Bean实例、 通过依赖注入,注入Bean依赖
    二阶段:检查Spring Awareness看实现了哪些接口,去做相应的处理
    三阶段:使用 Bean
    四阶段:容器关闭之前,调用Bean的销毁方法销毁Bean。

    11.BeanFactory和ApplicationContext

    ApplicationContext 应用上下文,继承BeanFactory接口,它是Spring的一种更高级的容器,提供了更多的拓展功能。
    BeanFactory应用启动的时候占用资源很少;对资源要求较高的应用,比较有优势;
    ApplicationContext 所有的Bean在启动的时候都加载,系统运行的速度快;

    12.Spring常用的注解

    @Controller 用于标注控制层组件
    @Service 用于标注业务层组件
    @Repository用于标注数据访问组件,即DAO组件
    @Component 指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
    @Autowired 自动装配
    @Configuration 声明当前类为配置类

    Spring 如何解决循环依赖的问题

    如何检测是否有循环依赖?
    在Bean创建的时候打个标记,然后递归调用回来的时候发现正在创建中,就是循环依赖。
    什么是循环依赖:A依赖B B依赖C C依赖A,最终形成闭环。循环依赖根据注入方式的不同分为了 构造器注入
    Spring中解决循环依赖使用了三级缓存。

    Spring三级缓存指的是?
    一级: 我们平常理解的单例池。
    二级:存储的是单例工厂。
    三级:存储正在创建中的单例对象。

    相关文章

      网友评论

        本文标题:Java框架常见面试题-Spring

        本文链接:https://www.haomeiwen.com/subject/kateertx.html