SSM面试题,只会使用技术是远远不够的

1、spring是什么?核心功能是什么?

spring是一个轻量级的java开发框架,

目的是为了解决企业级应用开发的业务逻辑层与其他各层的耦合问题。

为开发java应用程序提供了全面的基础架构支持,使java开发者可以专注于应用程序的开发。

核心功能是:依赖注入,面向切面编程

2、spring的ioc实现机制是什么?

将创建对象的权力交给spring容器;

spring容器通过工厂模式加反射机制拿到定义的类来创建对象,然后存放在spring容器中进行管理

在程序运行期间,通过spring容器,利用依赖关系注入的方式,

动态的将某种依赖关系注入到对象中,实现对象之间的解耦

3、spring依赖注入的方式有哪些?

setter方法注入,为被注入的类的属性提供setter方法,然后在bean标签中注入被依赖的对象

构造器注入

p空间注入

字段注入,也叫注解,@AutoWired

4、什么是单例模式?单例的实现方式有哪些?

使用该模式的类只能创建一个对象,无论创建多少次对象,创建出来的对象都是同一个;

懒汉模式:

私有构造器,私有静态属性,在公有方法被调用时判断该静态属性是否为空,

为空,则创建单例对象;

饿汉模式:

在使用类获取对象的时候,对象已经提前创建好了

私有的静态属性,属性值为该类的实例化对象

私有的构造器,使该类不能在其它类中被实例化

一个共有的方法,返回值为定义的私有静态属性

5、spring的常用注解有哪些?

@Component 组件

@Controller 控制层 即controller组件

@Service 业务逻辑层 即service组件

@Repository 数据访问层 即dao组件

@Autowired 对被注入的属性进行标注,spring容器会完成自动装配的工作

@RequesMapping 映射Web请求,包括访问路径和参数

@ResponseBody 将返回值放在response内,不返回视图,而是返回数据,比如json数据

@Transaction 声明事务,可以添加在类或者方法上

6、什么是aop?aop的实现机制是什么?

面向切面编程,是对oop的补充;

oop是纵向执行代码,而aop是横向织入代码,将一些重复使用的代码通过代理织入

采用动态代理实现aop;

如果目标对象没有实现接口,采用cglib动态代理,

如果目标对象实现接口,采用jdk动态代理

7、spring通知类型有哪些?分别执行时机是什么?

前置通知before,在目标方法之前织入;

后置通知after-retuning,在目标方法后织入;

环绕通知around,目标方法前后执行

最终通知after,最后执行

异常通知after-throwing,出现异常了执行

8、jdk动态代理和cglib代理的区别是什么?

java动态代理是利用反射机制生成一个实现代理接口的匿名类,

在调用具体方法前调用InvokeHandler来处理。

而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,

通过修改其字节码生成子类来处理。

9、什么是事务?事务有哪些特性?

在数据库中,用于完成一个功能的多个操作的集合
比如转账:转账这个事务中有两个操作,转出方扣钱,转入方加钱

原子性:多个操作构成的集合是一个整体,不可分割
事务的特性:

一致性:事务中的所有操作要么全部成功,要么全部失败

隔离性:可能有许多事务会同时处理相同的数据,

因此每个事务都应该与其他的事务隔离开来,防止数据损害

持久性:事务完成,数据将永久存储

10、spring事务的隔离级别有哪些?

ISOLATION_DEFAULT,后端数据库默认隔离级别

ISOLATION_READ_UNCOMMITTED ,允许读取尚未提交的数据变更,
可能会导致脏读、幻读或不可重复读

ISOLATION_READ_COMMITTED,允许读取并发事务已经提交的数据,
可以阻止脏读,但是幻读或不可重复读仍有可能发生

ISOLATION_REPEATABLE_READ,对同一字段的多次读取结果都是一致的,
除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

ISOLATION_SERIALIZABLE,最高的隔离级别,完全服从ACID的隔离级别,
确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,
因为它通常是通过完全锁定事务相关的数据库表来实现的

11、spring事务的传播机制有哪些?

propagation-requierd:如果当前没有事务,就新建一个事务,
如果已存在一个事务中,则加入到这个事务中,这个是默认选项。

propagation-supports:如果当前有事务,则支持当前事务,
如果当前没有事务,就以非事务方法执行。

propagation-mandatory:如果当前有事务,则使用当前的事务,
如果没有当前事务,就抛出异常。

propagation-required_new:无论当前有没有事务,都要新建事务,
如果当前存在事务,把当前事务挂起。

propagation-not_supported:以非事务方式执行操作,
如果当前存在事务,就把当前事务挂起。

propagation-never:以非事务方式执行操作,
如果当前事务存在则抛出异常。

propagation-nested:如果当前存在事务,则作为子事务在嵌套事务内执行
如果当前没有事务,则执行与propagation_required类似的操作

12、spring事务管理方式有哪些?

编程式事务管理:程序员自己调用事务管理的方法,

需要在业务逻辑代码中掺杂事务管理的代码

声明式事务管理:Spring 的声明式事务管理是建立在 Spring AOP 机制之上的,

其本质是对目标方法前后进行拦截,并在目标方法开始之前创建或者加入一个事务,

在执行完目标方法之后根据执行情况提交或者回滚事务;只需在配置文件中作相关的事务规则声明

13、什么是springMVC?

tomcat启动只会去servlet容器中查找对象;

所以不能将servlet放在spring容器中托管;

springmvc是spring的一个子框架

也是一个mvc框架,将企业应用开发分层;

控制层Controller:使用servlet接受请求。

模型层model:使用javabean(service、dao、实体类、工具类)处理请求。

视图层view:使用jsp或html进行页面展示。

14、请谈谈springMVC的工作流程

浏览器发送请求给tomcat,tomcat接收请求

将请求交给dispatcherServlet,

dispatcherServlet根据url地址将请求转发给对应的controller

controller调用其它层执行请求映射的方法后返回视图

将视图交给视图解析器,解析后返回渲染的视图给dispatcherServlet,

dispatcherServlet将视图返回给tomcat

tomcat响应给浏览器

15、什么是浏览器的同源策略?如何处理跨域问题?

两个页面地址中的协议,域名,端口号一致,设置同源策略的主要目的是为了安全,
如果没有同源限制,浏览器中的cookie等数据能被随意读取,
对不同域下的dom任意操作,ajax任意请求其他网站的数据,包括隐私数据;

前端处理跨域问题jsonp,代理服务器
后端:使用token

16、数据库三范式是什么?

数据库建立的规范,一个有六个规范,企业一般只需要满足到第三范式
第一范式,要求所有域都是原子性的,即数据库的每一列都是不可分割的原子项;
第二范式在第一范式的基础上,消除非主属性对主码的部分函数依赖,即每一个表都有主键
第三范式在第二范式的基础上,消除传递依赖;解决数据冗余的问题

17、什么是mybatis?

持久层框架,对jdbc操作数据库的过程进行封装,使开发者只需要关注sql本身,
我们原来使用JDBC操作数据库,需要手动的写代码去注册驱动、
获取connection、获取statement等等,现在Mybaits帮助我们把这些事情做了,
我们只需要关注我们的业务sql即可,这样可以提高我们的开发效率。

18、mybatis中,#{}和${}区别是什么?

#{}用占位符,避免sql拼接。
防止sql注入漏洞。
passwd=‘密码 or 1=1’
${}底层使用Statement
passwd=‘mima’ or 1=1

19、mybatis的执行流程是什么?

读取mybatis配置文件,
加载配置mapper文件,
构建会话工厂
构建会话对象
executor执行器
mappedStatement对象
输入映射;
输出映射

20、什么是数据库连接池?常用的数据库连接池有哪些?

数据库连接池负责分配、管理和释放数据库连接,
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
建立一个数据库连接是一件非常耗时(消耗时间)耗力(消耗资源)的事情。之所以会这样,
是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如套接字或命名管道),
与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等等。

连接池就是这样一个容器:它存放了一定数量的与数据库服务器的物理连接。
因此,当我们需要连接数据库服务器的时候,只需去池(容器)中取出一条空闲的连接,
而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。

常用数据库连接池:druid,c3p0,dbcp

21、什么是日志?日志级别有哪些?常见的日志框架有哪些?

日志就是记录程序的运行轨迹,方便查找关键信息,
也方便快速定位解决问题,开发中通过日志快速排查错误

日志级别:分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、Trace、ALL或者自定义的级别

spring框架支持日志,springmvc也支持日志,mybatis框架也支持日志。

22、什么是延迟加载?全局延迟加载如何实现?局部延迟加载如何实现?

针对关联查询操作,即依赖的对象,在不需要时,先不加载。

在配置mybatis框架时:
全局延迟加载:
开启延迟加载开关,默认false-
<setting name=“lazyLoadingEnabled” value=“true”/

在延迟加载的基础上使用:
false按需加载 , 访问指定属性,不会加载其他属性;
true 全部加载 , 访问任意属性,都会加载全部属性;

<setting name=“aggressiveLazyLoading” value=“true”/

局部延迟加载:
<association fetchType=“lazy” …
<collection fetchType=“lazy” …

23、mybatis多表关联查询,一对一怎么实现,一对多怎么实现?

实现一对一:

第一种方式:可以建立一个实体类,将两张表中数据都放在这个实体类中,然后在sql语句中查询两张表;

第二种方式:每一张表建立一个实体类,主表中外键列不写,在从表对应实体类中使用主表对应类对象,

每一个实体类一个mapper,然后手动结果集映射,association中调用主表对应的查询mapper

实现一对多:

使用集合collection ,实体类中属性为另一张表对应实体类的集合

24、mybatis缓存有几种?分别是什么?有什么区别?缓存什么时候失效?

三种,
分为一级缓存二级缓存以及自定义缓存,
一级缓存即 SqlSession级别的缓存,实现在同一个会话中数据的共享

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

缓存失效:
1、进行增删改操作,清除对应的一级缓存和二级缓存。

2、Session flush或close,清除对应的一级缓存。

25、你知道哪些设计模式?请简单描述一下。

单例模式:每个类只有一个对象
工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,

工厂模式使其创建过程延迟到子类进行。

适配器模式:将一个类的接口转换成客户希望的另外一个接口。

适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

前端控制器模式:用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理

代理模式:一个类代表另一个类的功能,为其他对象提供一种代理以控制对这个对象的访问

过滤器模式:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。

mvc模式:应用程序的分层开发

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值