SSM框架常考面试题汇集(Java面试)

简介: 吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…

在这里插入图片描述

  • 小编按:Spring-SpringMVC-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
目录
相关文章
|
1月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
264 37
|
3天前
|
存储 安全 Java
java基础面试题
java基础面试题
12 2
|
3天前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
20 1
|
4天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
19 2
|
1月前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
1月前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
1月前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
8天前
|
缓存 安全 Java
三万字长文Java面试题——基础篇(注:该篇博客将会一直维护 最新维护时间:2024年9月18日)
本文是一篇全面的Java面试题指南,涵盖了Java基础、数据类型、面向对象、异常处理、IO流、反射、代理模式、泛型、枚举、Lambda表达式、Stream流等多个方面的知识点,并提供了详细的解析和代码示例。
31 0
三万字长文Java面试题——基础篇(注:该篇博客将会一直维护 最新维护时间:2024年9月18日)
|
8天前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
16 0
|
22天前
|
消息中间件 NoSQL Java
Java知识要点及面试题
该文档涵盖Java后端开发的关键知识点,包括Java基础、JVM、多线程、MySQL、Redis、Spring框架、Spring Cloud、Kafka及分布式系统设计。针对每个主题,文档列举了重要概念及面试常问问题,帮助读者全面掌握相关技术并准备面试。例如,Java基础部分涉及面向对象编程、数据类型、异常处理等;JVM部分则讲解内存结构、类加载机制及垃圾回收算法。此外,还介绍了多线程的生命周期、同步机制及线程池使用,数据库设计与优化,以及分布式系统中的微服务、RPC调用和负载均衡等。