第三阶段-Spring面试题

1.何为Spring Bean容器?Spring Bean容器与Spring IOC容器有什么不同吗?

用于创建bean对象,管理bean对象的那个容器Spring IOC容器本质上指的是Spring Bean容器,核心机制就是IOC机制(控制反转),所以有时候又将Spring Bean容器称为Spring IOC容器。

2.Spring IOC如何理解?

依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
ioc 控制反转,指将对象的创建权,反转到Spring容器 ,
DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入

3.Spring DI如何理解?

DI是spring的依赖注入机制,IOC的实现需要这种机制,其实依赖注入是控制反转最常见的实现。

4.Spring中基于注解如何配置对象作用域?以及如何配置延迟加载机制?

1.配置作用域需要注解@Scope(“Singleton”)

  • 单例(Singleton):在整个应用中,只创建 Bean 的一个实例。
  • 原型(Prototype):每次注入或者通过 Spring 应用上下文获取的时候,都会创建一个新的 Bean 实例。
  • 会话(Session): 在 Web 应用中,为每个会话创建一个 Bean 实例。
  • 请求(Request):在 Web 应用中,为每个请求创建一个 Bean 实例。
    2.开启延迟加载:@Lazy(value=true)

5.Spring工厂底层构建Bean对象借助什么机制?当对象不使用要释放资源,目的是什么?何为内存泄漏?

1.借助反射机制,防止内存泄漏。
2.不使用释放资源防止内存泄漏。
3.对象不再使用但占着内部,为内存泄漏。

6.描述Spring MVC处理流程及应用优势

1.用户发送请求至前端控制器(DispatcherServlet);
提示:DispatcherServlet的作用:接收请求,调用其它组件处理请求,响应结果,相当于转发器、中央处理器,是整个流程控制的中心。
2.前端控制器(DispatcherServlet)收到请求后调用处理器映射器(HandlerMapping),处理器映射器(HandlerMapping)找到具体的Controller返回给前端控制器;
3.前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter);

4.前端控制器(DispatcherServlet)将执行的结果(ModelAndView)传给视图解析器(ViewReslover),
视图解析器(ViewReslover)根据View(逻辑视图名)解析后返回具体JSP页面;
5.前端控制器(DispatcherServlet)根据Model对View进行渲染(即将模型数据填充至视图中),
前端控制器(DispatcherServlet)将填充了数据的网页响应给用户;

7.Mybatis应用中#与$有什么异同点?

相同点:都是通过get来取值的;
不同点:$传过去的字符串不带引号,#号带引号;

8.Mybatis应用动态SQL解决了什么问题?

提供多种注解,可以提供动态查询语句,

9.Shiro框架权限管理时的认证和授权流程描述

应用代码->调用Subject(登录用户)控制权限->Subject在shiro内部调用SecurityManager(安全管理器)->安全管理器调用Realm(程序和安全数据连接器,连接后台数据库)

10.请解释Spring Bean的生命周期

在这里插入图片描述
在这里插入图片描述
1.实例化:第 1 步,实例化一个 bean 对象;

2.属性赋值:第 2 步,为 bean 设置相关属性和依赖;

3.初始化:第 3~7 步,步骤较多,其中第 5、6 步为初始化操作,第 3、4 步为在初始化前执行,第 7 步在初始化后执行,该阶段结束,才能被用户使用;

4.销毁:第 8~10步,第8步不是真正意义上的销毁(还没使用呢),而是先在使用前注册了销毁的相关调用接口,为了后面第9、10步真正销毁 bean 时再执行相应的方法。

11.Spring Bean的作用域之间的区别

在这里插入图片描述

12.在Spring AOP中,关注点和横切关注的区别是什么

**AOP:**这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

13.使用Spring框架的好处

  • 轻量:Spring是轻量的,基本版本大约2MB
  • 控制反转:把创建对象全权交给Spring管理
  • 面向切面的编程(AOP):把应用业务逻辑和系统服务分开
  • 容器:管理应用中对象的生命周期和配置
  • MVC框架:是web框架的一个很好的替代品
  • 事务管理:被视为单一的工作单元的操作序列。这些操作应该要么完整地执行,要么完全不执行
  • 异常管理:提供方便的API把具体技术相关的异常

14.Spring 中用到了那些设计模式?

  • 代理模式—在AOP和remoting中被用的比较多。
  • 单例模式—在spring配置文件中定义的bean默认为单例模式。
  • 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
  • 工厂模式—BeanFactory用来创建对象的实例。
  • 适配器–spring aop
  • 装饰器–spring data hashmapper
  • 观察者– spring 时间驱动模型
  • 回调–Spring ResourceLoaderAware回调接口

15.在Spring中如何注入一个java集合

  • list类型用于注入一列值,允许有相同的值。
  • set 类型用于注入一组值,不允许有相同的值。
  • map类型用于注入一组键值对,键和值都可以为任意类型。
  • props类型用于注入一组键值对,键和值都只能为String类型

16.Spring支持的事务管理类型

  • 编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
  • 声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。

17.Spring MVC的主要组件?

1.前端控制器 DispatcherServlet
2.处理器映射器HandlerMapping
3.处理器适配器HandlerAdapter
4.处理器Handler
5.视图解析器 ViewResolver
6.视图View

18.Mybatis中#和$的区别

  1. #{}是预编译处理,${}是字符串替换。
  2. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
  3. Mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值,相当于字符串拼接;
  4. 使用#{}可以有效的防止SQL注入,提高系统安全性。

19.Mybatis的缓存机制,一级,二级介绍一下

1.一级缓存

  • 默认开启

  • SqlSession级别的缓存,实现在同一个会话中数据的共享

  • 一级缓存的生命周期和SqlSession一致

  • 当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据。
    2.二级缓存

  • 默认不开启,需手动开启

  • SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量;

  • 可自定义存储源,如Ehcache;

  • 当开启缓存后,数据查询的执行的流程是:二级缓存>一级缓存>数据库;

  • 不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现;

20.SpringMVC和Struts2的区别

  • Springmvc的入口是一个servlet即前端控制器,基于方法开发;
  • struts2入口是一个filter过虑器,基于类开发;

21.Mybatis的基本工作流程

1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。
2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡
3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭
4.当用户使用mapper.xml文件中配置的的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。
5.将返回的结果通过映射,包装成java对象。
总结

  • 创建SqlSessionFactory
  • 通过SqlSessionFactory创建SqlSession
  • 通过SqlSession执行数据库操作
  • 调用session.commit()提交事务
  • 调用session.close()关闭事务

22.使用MyBatis的mapper接口调用时有哪些要求?

Mapper接口方法名和mapper.xml中定义的每个sql的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
Mapper.xml文件中的namespace即是mapper接口的类路径

23.谈谈你对SpringMVC的理解

1.是一个基于MVC的web框架;
2.是spring的一个模块,是spring的子容器,子容器可以拿父容器的东西,但是反过来不可;
2.SpringMVC的前端控制器是DispatcherServlet,用于分发请求。使开发变得简单;
4.SpringMVC流程(重点),三大组件:
在这里插入图片描述

  • HandlerMapping:处理器映射器
    用户请求路径到Controller方法的映射

  • HandlerAdapter:处理器适配器
    根据handler(controlelr类)的开发方式(注解开发/其他开发) 方式的不同去寻找不同的处理器适配器

  • ViewResolver:视图解析器
    可以解析JSP/freemarkerr/pdf等

24.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

  • Mybatis仅支持association关联对象collection关联集合对象的延迟加载,association指的就是一对一collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false
  • 它的原理是,使用CGLIB创建目标对象的代理对,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

25.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

1.使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。
2.使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

26.MyBatis里面的动态Sql是怎么设定的?用什么语法?

MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where、trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉 。

27.为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

28.对mybatis的理解

1.MyBatis是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。对JDBC操作进行了封装。
2.mybatis通过文件创建sqlsessionFactory,sqlsessionFatory根据配置文件获取sqlsession,sqlsession中包含了SQL语句,直接运行映射的sql语句,完成对数据的操作,用完关闭sqlsession。

29.事务管理的事务隔离级别

在这里插入图片描述

30.SpringMVC的工作流程

在这里插入图片描述
(1).用户发送请求 至 前端控制器(DispatcherServlet);

提示:DispatcherServlet的作用:接收请求,调用其它组件处理请求,响应结果,相当于转发器、中央处理器,是整个流程控制的中心

(2).前端控制器(DispatcherServlet)收到请求后调用处理器映射器(HandlerMapping)

处理器映射器(HandlerMapping)找到具体的Controller(可以根据xml配置、注解进行查找),并将Controller返回给DispatcherServlet;

(3).前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)。处理器适配器经过适配调用具体的Controller;(Controller–> service --> Dao --> 数据库)

Controller执行完成后返回ModelAndView,

提示:Model(模型数据,即Controller处理的结果,Map) View(逻辑视图名,即负责展示结果的JSP页面的名字)

处理器适配器(HandlerAdapter)将controller执行的结果(ModelAndView)返回给前端控制器(DispatcherServlet);

(4).前端控制器(DispatcherServlet)将执行的结果(ModelAndView)传给视图解析器(ViewReslover)

视图解析器(ViewReslover)根据View(逻辑视图名)解析后返回具体JSP页面

(5).前端控制器(DispatcherServlet)根据Model对View进行渲染(即将模型数据填充至视图中);

前端控制器(DispatcherServlet)将填充了数据的网页响应给用户。

31.1.47如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?

1.springmvc的入口是一个servlet即前端控制器,基于方法开,而struts2入口是一个filter过滤器,基于类开发。
2.

  • springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
  • Struts采用值栈存储请求和响应的数据,通过OGNL存取数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值