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
目录
相关文章
|
6天前
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
6天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
6天前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
6天前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
6天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
6天前
|
缓存 Java 数据库
【Java面试题汇总】Spring篇(2023版)
IoC、DI、aop、事务、为什么不建议@Transactional、事务传播级别、@Autowired和@Resource注解的区别、BeanFactory和FactoryBean的区别、Bean的作用域,以及默认的作用域、Bean的生命周期、循环依赖、三级缓存、
【Java面试题汇总】Spring篇(2023版)
|
6天前
|
存储 缓存 监控
【Java面试题汇总】JVM篇(2023版)
JVM内存模型、双亲委派模型、类加载机制、内存溢出、垃圾回收机制、内存泄漏、垃圾回收流程、垃圾回收器、G1、CMS、JVM调优
【Java面试题汇总】JVM篇(2023版)
|
6天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
1天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应