2020年Java面试题讲解之关于Spring/SpringMVC的几个基础问题

举报
轻狂书生FS 发表于 2020/12/02 22:49:32 2020/12/02
【摘要】 --为什么要使用Spring     Spring提供IOC技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦     Spring提供了事务支持,使得事务操作变得更加方便。     Spring提供了面向切面编程,这样可以很方便的处理某一类的问题。     更方便的框架集成,Spring可以很方便的集成其他框架,比如Mybatis...

--为什么要使用Spring

    Spring提供IOC技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦
    Spring提供了事务支持,使得事务操作变得更加方便。
    Spring提供了面向切面编程,这样可以很方便的处理某一类的问题。
    更方便的框架集成,Spring可以很方便的集成其他框架,比如Mybatis、Hibernate等

--解释一下什么是AOP?

    AOP是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
    简单来说就是统一处理某一“切面"(类)的问题的编程思想,比如统一处理日志,异常等
--解释一下什么是IOC?
    IOC:Inversion of Control(中文:控制反转)是Spring的核心,对于Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。
    简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理;了,有其他(类,第三方容器)来管理。

--Spring有哪些主要模块?

    Spring Core:框架的最基础部分,提供IOC和依赖注入特性。
    Spring Context:构建与core封装包基础上的Context封装包,提供了一种框架式的对象访问方法。
    Spring DAO:Data Access Object提供了JDBC的抽象层。
    Spring AOP:提供了面向切面的编程实现,让你可以自定义拦截器、切点等
    Spring Web:提供了针对web开发的集成特性,例如文件上传,利用serlvet listeners进行IOC容器初始化和针对web的ApplicationContext。
    Spring Web MVC:Spring中的MVC封装包提供了web应用的Model-View-Controller(MVC)的实现。

--Spring常用的注入方式有哪些?

    setter属性注入
    构造方法注入
    注解方式注入

--Spring中的Bean是线程安全的吗?

    Spring中的Bean默认是单例模式,Spring框架并没有对单例Bean进行多线程的封装处理。
    实际上大部分时候SpringBean无状态的(比如DAO类),所有某种程度上来说bean也是安全的,但如果bean有状态的话(比如view model对象),那就要开发者自己家去保证线程安全了,最简单的就是改变Bean的作用域,把“Singleton”变更为“prototype”,这样请求Bean相当于new Bean()了,所以就可以保证线程安全了。
        有状态就是有数据存储功能
        无状态就是不会保存数据

--Spring支持几种Bean的作用域?

    singleton:Spring IOC容器中只能存一个Bean实例,bean以单例模式存在,是系统默认值;
    prototype:每次从容器调用Bean时都会创建一个新的示例,即每次genBean()相当于执行new Bean()操作。
    Web环境下的作用域:
        request:每次HTTP请求都会创建一个Bean。
        session:同一个HTTP Session共享一个Bean实例。
        global-session:用于portlet容器,因为每个portlet有单独的session,globalsession提供了一个全局性的HTTP Session。
    注意:使用prototype作用域需要慎重的思考,因为频繁创建和销毁bean会带来很大的性能开销。

--Spring自动装配Bean有哪些方式?

    no:默认值,表示没用自动装配,应使用显示bean引用进行装配。
    byName:它根据bean的名称注入对象依赖项。
    byType:它根据类型注入对象依赖项。
    构造函数:通过构造函数来注入依赖项,需要设置大量的参数。
    autodetect:容器首先通过构造函数使用autowire装配,如果不能,则通过byType自动装配。

--Spring事务实现方式有哪些?

    声明式事务:声明式事务也有两种实现方式,基于xml配置文件的方式和注解方式(在类上添加@transaction注解)
    编码方式:提供编码的形式管理和维护事务。

--说一下Spring的事务隔离?

    Spring有五大隔离级别,默认值为ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致。
    ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么。
    ISOLATION_READ_UNCOMMITTED:未提交读,最低隔离级别,事务未提交前,就可被其他事务读取(会出现幻读、脏读和不可重复读)
    ISOLATION_READ_COMMITTED:提交读,一个事务提交后才能被其他事物读取到(会造成幻读和不可重复读),SQL server的默认级别。
    ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MYSQL的默认级别。
    ISOLATION_SERLALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读,不可重复读、幻读。
    


    脏读:表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事物尝试插入记录A,此时该事物还未提交,然后另一个事物尝试读取到了记录A。
    不可重复读:是指在一个事务内,多次读同一数据。
    幻读:指同一个事务内多次查询换回的结果集不一样。比如同一事务A第一次查询时候有n条记录,但是第二次同等条件下查询却有n+1条记录,这就好像产生了幻觉。发生幻读的原因也是另一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

--说一下SpringMVC运行流程?

    SpringMVC先将请求发送给DispatchServlet。
    DispatchServlet查询一个或者多个HandlerMapping,找到处理请求的Controller。
    DispatchServlet再把请求提交到对应的Controller。
    Controller进行业务逻辑处理后,会返回一个ModelAndView。
    DispatchServlet查询一个或者多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象。
    视图对象负责渲染返回给客户端。

--SpringMVC有哪些组件?

    前置控制器:DispatchServlet
    映射控制器:HandlerMapping
    处理器:Controller
    模型和视图:ModelAndView
    视图解析器:ViewReSolver

--@RequestMapping的作用是什么?

    将HTTP请求映射到相应的类或者方法上。

--@Autowired的作用是什么?

    @Autowired它可以对类成员变量,方法及构造函数进行标注,完成自动装配的工作,通过@Autowired的使用来消除set/get方法。

文章来源: blog.csdn.net,作者:轻狂书生FS,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/LookForDream_/article/details/107504747

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。