SSM框架常考面试题汇集 —(JAVA面试)
欢迎你的阅读,本文整理了JAVA面试SSM框架常考的面试题,大家一起学习共同进步。
- JAVA基础面试问题请参考:JAVA基础问题汇集
小编按:Spring-SpringMVC-Mybatis 顺序整理
文章目录
- 1. 简述什么是 IoC 和 DI ?
- 2. DI 是如何实现的?
- 3. 解释一下什么叫 AOP (面向切面编程)?
- 4. 阐述 Spring 框架中 Bean 的生命周期?
- 5. Spring 里面的 aop的原理是什么 ?
- 6. Spring主要使用了什么模式?
- 7. 简述Spring 中的事务 ?
- 8. SpringMVC的核心是什么,请求的流程是怎么处理的 ?
- 9. MyBatis 中使用 # 和 $ 书写占位符有什么区别 ?
- 10.Mybatis的好处 ?
- 11.简述Mybatis的一级缓存和二级缓存 ?
- 12.MyBatis 中的动态 SQL 是什么意思 ?
- 13.Mybatis工作原理简述
1. 简述什么是 IoC 和 DI ?
- IoC 叫控制反转,是 Inversion of Control 的缩写,DI(Dependency Injection)叫依赖注入,是对 IoC 更简单的诠释。
控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的"控制反转"就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。
IoC 体现了好莱坞原则 - “Don’t call me, we will call you”。依赖注入的基本原则是应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由容器负责,查找资源的逻辑应该从应用组件的代码中抽取出来,交给容器来完成。
DI 是对 IoC 更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
2. DI 是如何实现的?
- ①依赖注入可以通过 setter 方法注入(设值注入)
<property name="id" value="1314"></property>
- ②构造器注入:通过构造方法初始化
<constructor-arg index="0" type="java.lang.String" value="辰兮"></constructor-arg>
- ③接口注入三种方式来实现
Spring 支持 setter注入和构造器注入,通常使用构造器注入来注入必须的依赖关系,对于可选的依赖关系,则 setter注入是更好的选择,setter注入需要类提供无参构造器或者无参的静态工厂方法来创建对象。
- 小结::IoC解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。
3. 解释一下什么叫 AOP (面向切面编程)?
- AOP(Aspect-Oriented Programming)指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。
4. 阐述 Spring 框架中 Bean 的生命周期?
- ① Spring IoC 容器找到关于 Bean 的定义并实例化该 Bean。
- ② Spring IoC 容器对 Bean 进行依赖注入。
- ③ 如果 Bean 实现了 BeanNameAware 接口,则将该 Bean 的 id 传给 setBeanName 方法。
- ④ 如果 Bean 实现了 BeanFactoryAware 接口,则将 BeanFactory 对象传给 setBeanFactory
方法。 - ⑤ 如果 Bean 实现了 BeanPostProcessor 接口,则调用其
postProcessBeforeInitialization 方法。 - ⑥ 如果 Bean 实现了 InitializingBean 接口,则调用其 afterPropertySet 方法。
- ⑦ 如果有和 Bean 关联的 BeanPostProcessors 对象,则这些对象的postProcessAfterInitialization 方法被调用。
- ⑧ 当销毁 Bean 实例时,如果 Bean 实现了 DisposableBean 接口,则调用其 destroy 方法。
5. Spring 里面的 aop的原理是什么 ?
- 实现 AOP 的技术,主要分为两大类:
一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码
。通过反射创建动态代理对象,拦截方法执行,在将自己需要额外执行的代码加塞进来执行。
6. Spring主要使用了什么模式?
- 工厂模式:每个Bean的创建通过方法
- 单例模式:默认的每个Bean的作用域都是单例
- 代理模式:关于Aop的实现通过代理模式
7. 简述Spring 中的事务 ?
- ①编程式事务管理:编程方式管理事务,极大灵活性,难维护。
- ②声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务。
8. SpringMVC的核心是什么,请求的流程是怎么处理的 ?
- springmvc 是基于 servlet 的前端控制框架,核心是 ioc 和 aop(基于 spring 实现)
-
请求流程结合图形脑补记忆
-
1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.
-
2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。
-
3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。
-
5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。
-
6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。
-
7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。
9. MyBatis 中使用 # 和 $ 书写占位符有什么区别 ?
- ①#将传入的数据都当成一个字符串,会对传入的数据自动加上引号
- ② $将传入的数据直接显示生成在 SQL 中。
- 注意:使用 $ 占位符可能会导致 SQL 注射攻击,能用#的地方就不要使用 $ ,写 order by 子句的时候应该用$而不是#。
10.Mybatis的好处 ?
- ①把Sql语句从Java中独立出来。
- ②封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。
- ③自己编写Sql语句,更加的灵活。
- ④入参无需用对象封装(或者map封装),使用@Param注解。
11.简述Mybatis的一级缓存和二级缓存 ?
-
①
一级缓存是SqlSession级别的缓存。
在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。(但是增删改查等数据库操作都会清空缓存)。 -
②
二级缓存是mapper级别的缓存
,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
12.MyBatis 中的动态 SQL 是什么意思 ?
- 对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,例如在 58同城上面找房子,我们可能会指定面积、楼层和所在位置来查找房源,也可能会指定面积、价格、户型和所在位置来查找房源,此时就需要根据用户指定的条件动态生成 SQL 语句。
- 如果不使用持久层框架我们可能需要自己拼装 SQL 语句,还好 MyBatis 提供了动态 SQL 的功能来解决这个问题。MyBatis中用于实现动态 SQL 的元素主要有:
- if
- choose / when / otherwise
- trim
- where
- set
- foreach
13.Mybatis工作原理简述
- ①通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory。
- ②SqlSessionFactory开启一个SqlSession,通过SqlSession实例获得Mapper对象并且运行Mapper映射的Sql语句。
- ③完成数据库的CRUD操作和事务提交,关闭SqlSession。
- Invest in yourself and improve yourself
2020.03.15. 记录辰兮的第28篇博客