《Java 面试问题 一 Spring 、SpringMVC 、Mybatis》
自己理解SSM框架可能问到的面试问题
一、需要知道的SSM基础知识
1.什么是Spring?
Spring 是一款轻量级的 IOC (依赖反转) 和 APO (面向切面) 容器框架。(个人理解: 就是一个Bean对象容器,不用我们new 对象了,将对象的创建交给容器系统来管理了)
常见的配置方式有三种 :
1.基于 xml 的配置方式 2.基于注解的配置方式 3.基于Java的配置方式 (虽然这种我没怎么用过吧,但是确实是存在)
2.Spring Bean对象的作用范围
1 ) . singleton :这种bean的范围是默认的,不管来了多少请求返回的都是这个对象,单例模式 ,正是这个原因(全局共享一个变量) 可能会造成线程不安全,但是只有 有状态Bean的时候才可能会出现
prototype : 原形范围与单例范围相反,为每一个请求都创建一个对象
request : 在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
session :与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
global-session :global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。(这个是直接复制粘贴的,并没有直接理解)
3.Spring 用到的设计模式
答: 简单工厂模式、工厂模式、代理模式、单例模式、模板模式......(暂时没有理解到的,还有好多)
4.Spring 基于xml 注入bean的几种方法:
答:
1.set方法
2.构造器方法 (两个参数同类型:可以使用index中)
3.静态工厂方法
4.实例工厂方法
5.使用Spring的优点
1.可以解耦合
2.通过使用AOP可以方便的进行事务管理 、权限控制、日志管理
3.Spring 对主流框架进行了支持如 Struts2 和 Hibernate等
6.Spring事务管理的两种方式:
1.编程式事务:在代码中使用编程来完成事务管理 ,硬编码不推荐使用 (这个我还真的没有具体使用过,等使用过在来发表评论)
2.声明式事务: 在配置文件中进行声明配置,也可以使用注解进行配置 (推荐使用)
申声明式事务也分为两种:
1.基于注解的声明式事务
2.基于xml的声明式事务
7.Spring中的核心类有哪些?各有什么作用
好吧,我坦言 在Spring中我知道的类没有几个,一个手都能数过来,希望以后能好好的读一下Spring 的底层源码,但是我知道的有以下两个
BeanFactory : 对象的工厂,里面有对 对象的基本操作,比如说getBean,可以产生一个新的对象。
ApplicationContext: 继承了BeanFactory 功能比 BeanFactory更多
..........
未完。待续
8.DI 和 IOC的理解
一、IOC介绍
IOC是控制反转。
创建对象实例的控制权从代码控制剥离到IOC容器控制(之前的写法,由程序代码直接操控使用new关键字),实际就是你在xml文件控制,控制权的转移是所谓反转,侧重于原理。
二、DI介绍
DI是依赖注入
创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。
三、区别
1.它们是spring核心思想的不同方面的描述。
2.依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。
依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;
而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
9.什么是SpringMVC:
SpringMVC是一款基于Java实现的MCV设计模式的一款轻量级web框架,他实现了web内容的解耦合。
10.SpringMVC处理用户请求的流程:
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5.执行处理器(Controller,也叫后端控制器)。
6.Controller执行完成返回ModelAndView
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11.DispatcherServlet响应用户
11.SpringMVC 如何解决中文POST 和 GET请求乱码问题
1.get请求 可以使用手动转换 String name = new String(xx.getBytes(“iso-8859-1”),”utf-8”);
如果不起作用的话可以修改 server.xml 和工程的编码都为 utf-8
2.post 请求中文乱码问题解决方式
在web.xml 文件中配置Spring中的 CharacterEncoding Filter
12.SpringMVC如何响应JSON数据给Ajax使用
1.使用Jaskon jar包
2.配置ResponseBody
3.在配置文件中配置 <mvc:annotation-driven />
13.什么是Mybatis?
1. mybatis 是一款半ORM框架(他内部封装了JDBC的操作 是开发者专注于sql的编写,并不用关心驱动的加载,连接对象的创建、创建statement对象等复杂的操作过程)灵活性高。
2.mybatis可以使用xml 或者注解来进行对Entity对象于数据库表中的字段进行对应,避免了JDBC返回结果集的设置
3.通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。 (这个是我抄的。。。。。)
14.Mybatis的优点
1.可以灵活的编写sql语句
2.对各种数据库有很好的兼容
3.与JDBC相比 减少了50%的代码,减少了大量的冗余代码,不用手动 创建和关闭连接
4.能够与Spring进行很好的集成
15.Mybatis的缺点
1.如果涉及的业务逻辑比较负责,涉及到多表关联,对程序开发人员的sql语句功底掌握要求较高
2. 可移植性差 sql语句与具体使用的数据库有很大关系,如果更换数据库,sql语句可能需要重新编写。
16. ${} 和 #{}的区别
# 是预编译处理
$ 是字符串替换
Mybatis 在处理 #{} 会将sql 中的#{} 替换成 ? 并调用 PreparedStatement的set方法来设置值
Mybatis 在处理${} 会直接将sql 中的${} 直接替换成字符串 ,存在sql 注入问题
17. 当实体类中的属性和表中的字段名称不一致该怎么解决?
解决方案1: 在查询的sql 语句中定义字段的别名,让别名和类属性的名称一致
<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
</select>
解决方案2: 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系。
<select id="getOrder" parameterType="int" resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select> <resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用id属性来映射主键字段–>
<id property=”id” column=”order_id”> <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>
18.通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?
Dao接口里的方法,参数不同时,方法能重载吗?
Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。
Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MapperStatement对象。
举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面 id 为 findStudentById 的 MapperStatement。
Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。
————————————————————————还有好多知识,但是日后在补充————————————————————————————————
《Java 面试问题 一 Spring 、SpringMVC 、Mybatis》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- Python笔记_第四篇_高阶编程_魔法(术)方法详解(重载的再详解)
1. 魔法方法是什么? 魔法方法(Magic Method)是Python比较独特的应用,它可以给你的类增加特殊的方法,如果你的对象实现了(重载),这些方法中的某一个,就会被Python所调用.正如装 ...
- LaunchPad(思维)
链接:https://ac.nowcoder.com/acm/contest/3665/D来源:牛客网 题目描述 Hery is a boy with strong practical abiliti ...
- electron-builder打包跳过publish
默认情况下执行 npm run release使用build命令打包时自动将打包好的安装程序发布到仓库,有时候不需要每次打包都上传到仓库,这时我们只需要在build命令后面加上参数-p never 即 ...
- springmvc中那些易被忽略的小知识点
1.springmvc会为没有view的modelandview指定默认view 知道这个的时候我都惊呆了. 我从来都是手动指定view名字,今天看到别人写的代码竟然直接返回了个mav,貌似是在dis ...
- 吴裕雄--天生自然 PYTHON3开发学习:函数
def 函数名(参数列表): 函数体 # 计算面积函数 def area(width, height): return width * height def print_welcome(name): ...
- 在拖放文件的同时检测shift键的状态
老板要给原来文件拖放的功能加个扩展分类,于是想在文件拖放时判断shift键的状态来区分. 一般通过keydown和keyup来判断按下与否,但这都是需要控件事件触发,而在拖放的时候是没法触发key事件 ...
- Codeforces Round #556(Div.1)
A 容易发现i,i+1至少有一个数出现,于是可以让尽量多的2和奇数出现 #include<bits/stdc++.h> using namespace std; int n,s1,s2; ...
- selenium登录网银,密码控件输入
尝试登录农行网银,发现带控件的密码输入框怎么都无法输入啊 最后用虚拟键盘实现的 , DD模拟键盘 http://www.ddxoft.com/ 图形验证码识别没过,有时间再继续 需要安装 Tess ...
- c/c++[001]:start
作为一个学校课程跳过c语言的萌新,这次重新学习c/c++从源头上明白这两种不同的输入输出还是很有必要 scanf()是C语言中的一个输入函数.与printf函数一样,都被声明在头文件stdio.h里, ...
- 记一次线上“no such file or directory”问题处理
事件背景描述:项目是基于docker部署,在使用xxl-job的过程中,需要使用XxlJobLogger.log记录日志(非必须),项目定义日志其日志存储位置/home/logs.任务运行后包找不到文 ...