8.SSM框架(高频面试题)

文章目录

8.1 spring中常用的依赖注入方式

通过setter方法注入
通过构造方法注入

8.2 简述Spring中IOC容器常用的接口和具体的实现类

  • BeanFactory:SpringIOC容器的基本设置,是最底层的实现,面向框架本身的。
  • AppliancetionContext:BeanFactory的子接口,提供了更多高级的设定,面向开发者的。
  • ConfigurationApplicationContext:ApplicationContext的子接口,扩展出了close和refresh等关闭、刷新容器的方法。
  • ClassPathApplicationContext:从classpath的XML的配置文件中读取上下文,并生成 上下文定义,应用程序 上下文从 环境变量中取得。
  • FileSystemXmlApplicationContext:由文件系统中的 XML配置文件读取上下文 。
  • XMLWebApplicationContext:由Web应用的XML文件读取上下文。

8.3 简述Spring中如何基于注解配置和装配Bean

(1)首先在Spring中配置开启注解扫描。

<context:component-scan base-package=" "></context:component-scan>

(2)在具体的类上加上具体的注解
(3)Spring中通常使用@Autowired和@Resource等注解进行bean的装配。

8.4 说出Spring或SpringMVC中常用的5个注解,并解释含义

  • @Component:基本注解,标识一个受Spring管理的组件
  • @Controller:标识一个表示层的组件
  • @Service:标识一个业务层的组件
  • @Repository:标识一个持久层的组件
  • @Autowired:自动装配
  • @Qualifier(""):具体指定要装配的组件的id
  • @RequestMapping():完成请求的映射
  • @PathVariable:映射请求URL中占位符到请求处理方法的形参。

8.5 请解释SpringBean的生命周期

(1)默认情况下 ,SpringBean的生命周期分为5个阶段:

  • 调用构造器或者通过工厂的方式创建Bean对象。
  • 给bean对象的属性注入值。
  • 调用初始化方法,进行初始化,初始化方法是通过init-method来指定的。
  • 使用。
  • IOC容器关闭时,销毁bean对象

(2)当加入了Bean的后置处理器后,IOC容器中的bean的生命周期分为7个阶段

  • 调用构造器或者通过工厂的方式 创建bean对象
  • 给bean对象的属性注入值
  • 执行Bean后置处理器中的postProcessBeforeInitialization
  • 执行初始化方法,进行初始化 ,初始化方法是通过init-method来指定的。
  • 执行Bean的后置处理器中的postProcessAfterInitialization
  • 使用
  • IOC容器关闭时,销毁bean对象

8.6 谈一下SpringMVC的工作流程

  • 用户发送请求到前端控制器DispatcherServlet
  • DispatcherServlet接收到请求调用处理器映射器 HandlerMapping
  • 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成),并且一并返回给DispatcherServlet
  • DispatcherServlet调用处理器适配器HandlerAdapter
  • HanderAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
  • Controller执行完返回ModelAndView
  • HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
  • DispatcherServlet将ModelAndView传给视图解析器ViewResolver
  • ViewResolver解析后返回具体的View
  • DispatcherServlet根据View进行渲染视图(即将模型数据填充到视图中)
  • DispatcherServlet响应用户

8.7 SpringMVC中如何解决POST请求中文乱码问题

SpringMVC中通过CharacterEncodingFilter解决中文乱码问题
在web.xml中加入:

<filter >
	<filter-name>CharacterEncodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>encoding</init-param>
	<param-value>utf-8</param-value>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

8.8 SpringMVC中拦截器如何定义,如何配置以及拦截器中的3个重要的方法。

定义:有两种方式

  • 实现HandlerInterceptor接口
  • 继承HandlerInterceptorAdapter
    配置:
<mvc:interceptors>
	<!--默认是对所有请求都拦截-->
	<beab  id="MyInterceptor" class="com.xxx.interceptor.MyInterceptor"/>
	<!--只针对部分请求拦截或者不拦截-->
	<mvc:interceptor>
		<mvc:mapping path=""/><!--指定拦截-->
		<mvc:exclude-mapping path=""/><!--指定不拦截 -->
		<bean class="com.xxx.interceptor.MyInterceptor2"/>
	</mvc:interceptor>
</mvc:interceptors>

拦截器中3个重要的方法:

  • preHandle
  • postHandle
  • afterCompletion

8.9 MyBatis中#{}和${}的区别是什么?

#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 21: …串替换。 Mybatis在处理#̲{}时,会将sql中的#{}替…{]时,就是把${}替换成变量的值。
使用#{}可以有效地防止SQL注入,提高系统安全性。

8.10 MyBatis结果集的映射方式有几种,每种映射方式如何使用

  • 自动映射:通过resultType来指定映射的类型即可。
  • 自定义映射:通过resultMap来完成具体的映射规则,指定将结果集中的哪个映射到对象的哪个属性。

8.11 MyBatis的单个参数、多个参数如何传递及如何取值

  • Mybatis传递单个参数时,如果是普通类型(String+8个基本数据类型的)的,取值时可以在#{}中任意指定,如果是对象类型的,则在#{}中使用对象的属性名来取值。
  • Mybatis传递多个参数,默认情况下,Mybatis会对多个参数进行封装成Map,取值时在#{}可以使用0 1 2…或者是param1 param2…
  • Mybatis传递多个参数,建议使用命名参数,在Mapper接口的方法的形参前面使用。
  • @Param来指定封装Map时用的key,取值时在#{}中使用@Param指定的key。

8.12 Mybatis如何获取自动生成的(主)键值

在标签中使用useGeneratedKeys和keyProperty两个属性来自动获取生成的主键值。

<insert id="insertname" usegeneratedkeys="true" property="id">
	insert into names(name) values(#{name})
</insert>

8.13 简述Mybatis的动态SQL,列出常用的6个及其作用

动态Sql是Mybatis强大的特性之一,基于功能强大的OGNL表达式。
动态Sql主要用来解决查询条件不确定的情况,在程序运行的期间,根据提交的条件动态地完成查询。
常用的标签:
:进行条件的判断
:在判断后的sql语句前加上关键字 ,并处理sql语句开始 位置的AND或者OR的问题。
:可以再sql语句前后进行添加指定字符或者去掉指定字符
:用于修改操作时出现的逗号问题
:类似于java中的switch语句,在所选的条件中选择其一。
:迭代操作

8.14 Mybatis中不同的XML文件,id是否可以重复?

不同的XML配置文件,如果配置了namespace那么id可以重复;如果没有配置namespace,那么id不可以重复、

Mybatis如何完成MySql的批量操作,举例说明。

Mybatis完成Mysql的批量操作主要是通过来拼装响应的sql语句。

<insert>
	insert into tbl_employee(last_name,email,gender,d_id) values
	<foreach collection="emps"  item="curr_emp" separator=",">
		(#{curr_emp.lastName,#{curr_emp.email},#{curr_emp.gender},#{curr_emp.dept.id})
	</foreach>
</insert>

8.16 Spring中如何给bean对象注入式集合类型的属性

Spring使用等标签给对应的类型的集合注入值。

8.17 Spring中bean的作用域

Spring中的bean总共有4种作用域:

  • Singleton: 单例的
  • Prototype:原型的(非单例)
  • Request
  • Session

8.18 Spring中自动装配常用的两种装配模式

  • byName:根据对象的属性名进行装配
  • byType:根据bean对象的属性的类型进行装配,需要注意的是当发现多个兼容类型的bean对象的时候,会抛出异常。

8.19 Spring中@Autowired注解的工作机制以及required属性的作用。

(1)@Autowired注解的工作机制是首先会使用byType的方式进行装配,如果能唯一匹配,则装配成功;如果匹配到多个兼容类型的bean,则会尝试使用byName的方式进行唯一确定,如果能唯一确定,则装配成功。如果不能唯一确定,则装配失败,抛出异常。
(2)默认情况下,使用@Autowired注解的属性必须被装配,如果装配不了,则会抛出异常。可以使用required=false来设置不是必须装配。

8.20 SpringMvc中ContextLoaderListener的作用及实现原理。

作用:
ContextLoaderListener的作用是通过监听的方式在WEB应用服务器启动的时候将Spring的容器对象进行初始化 。
原理:
ContextLoaderListener实现了ServletContextListener接口,用于监听ServletContext的创建。当监听到ServletContext创建的时候,在对象的contextInitialized方法中,将Spring的容器对象进行创建,并将创建好的容器对象设置到ServletContext域对象中,目的是让各个组件可以通过ServletContext共享到Spring的容器对象。

8.21 简述Mybatis提供的两级缓存以及缓存的查找顺序

(1)Mybatis的缓存分为一级缓存和二级缓存。
一级缓存是SqlSession级别的缓存,默认开启。
二级缓存是NameSpace级别(Mapper)的缓存,多个SQLSession可以共享,使用时需要进行配置开启。
(2)缓存的查询顺序:二级缓存 > 一级缓存 > 数据库。

8.22 Spring与SpringMVC整合的时候,如何解决bean被创建两次的问题

bean被创建两次的问题解决方案是:在组件扫描的配置中指定,SpringMvc只负责扫描WEB相关的组件,Spring扫描除了SpringMVC以外的组件。

8.23 Spring与Mybatis整合的时候,主要整合的两个地方。

(1)SqlSession创建的问题 ,通过SqlSessionFactoryBean来配置用于创建SQLSession的信息。例如:Mybatis的核心配置文件,Mapper 配置文件,数据源等。
(2)Mapper接口创建的问题,使用MapperScannerConfigurer批量为Mybatis的Mapper接口生成代理实现类并将具体的对象交给Spring容器管理。

8.24 Spring声明事务中@Transaction中 常用的两种事务传播行为。

通过propagation来执行事务的传播行为。
REQUIRED:使用调用者的事务,如果调用者没有事务,则启动新的事务运行。
REQUIRES_NEW:将调用者的事务挂起,开启新的事务运行。

8.25 @RequestMapping注解的作用,可标注的位置,常用的属性。

(1)该注解的作用是完成请求与请求处理方法的映射。
(2)该注解可以标注在类上或者方法上。
(3)默认的属性:
value:默认属性,用于指定映射的请求URL
method:指定映射的请求方式。
params:指定映射的请求参数。
headers:指定映射的请求头信息。

8.26 SpringMVC中处理模型数据的两种方式。

  • 使用ModelAndView作为方法的返回值,将模型数据和视图信息封装到ModelAndView中。
  • 使用Map或者是Model作为方法的形参,将模型数据添加到Map或者是Model中。

8.27 REST中的四种请求方式对应的操作。

  • GET:查询操作
  • POST:添加操作
  • DELETE:删除操作
  • PUT:修改操作

8.28 视图和视图解析器的关系及作用

  • 视图是由视图解析器解析得到的。
  • 视图解析器是根据ModelAndView中的信息解析得到具体的视图对象。
  • 视图的作用是完成模型数据的渲染工作,最终完成转发或者是重定向的操作。

8.29 说出常用的3个视图类

  • InternalResourceView
  • JstlView
  • RedirectView

8.30 REST中HiddenHttpMethodFilter过滤器的作用。

  • 该过滤器的作用是负责转换客户端请求的方式,当浏览器的请求方式为POST,并且在请求中能通过_method获取到请求参数值 ,该过滤器就会进行请求参数的转换。
  • 一般在REST中,都是将POST请求转换为DELETE或者是PUT

8.31 SpringMVC中如何返回Json数据。

  • 1.在项目中加入json转换的依赖,例如Jackson、fastjson、gson等
  • 2.在请求处理方法中将返回值改成具体返回的数据的类型,例如数据的集合类List等
  • 3.在请求的方法上使用@ResponseBody注解

8.32 如何在Mybatis的增删改操作获取到对数据库的影响条数。

直接在Mapper接口的方法中声明返回值即可。

8.33 SpringMVC中控制器的注解是哪个?是否可以用别的注解代替。

使用@Controller注解来标注控制器,不可以使用别的注解代替。

8.34 如何在SpringMVC中获取客户端提交的请求参数

  • 直接在请求处理方法中声明对应的形参
  • 也可以使用@RequestParam注解来具体指定将哪些请求参数映射到方法中对应的形参。

8.35 简述 SpringMVC中InternalResourceViewResolver解析器的工作机制

使用prefix+方法的返回值+suffix生成一个物理视图路径

8.36 SpringMVC中如何完成重定向

在请求处理方法的返回值前面加上redirect:前缀,最终会解析的到Redirect View,RedirectVew会完成重定向的操作。

8.37 Spring中切面常用的几种通知,并简单解释。

  • 前置通知(Before):在目标方法执行之前执行
  • 后置通知(After):在目标方法执行之后执行,不管目标方法有没有抛出异常
  • 返回通知(After-returning):在目标方法成功返回之后执行,可以获取到目标方法的返回值
  • 异常通知(After-throwing):在目标方法抛出异常后执行
  • 环绕通知(Around):环绕着目标方法执行

8.38 Mybatis中@Param注解的作用

通过注解指定Mybatis底层在处理参数时封装Map时使用的Key,方便在SQL映射文件中取参数。

8.39 MyBatis中使用Mapper接口开发,如何完成Mapper接口与Sql映射文件、方法与Sql语句的绑定

  • Mapper接口与Sql映射文件的绑定:Sql映射文件中的namespace的值指定成Mapper接口的全类名。
  • 接口中方法与Sql语句的绑定:Sql语句的id指定成接口中的方法名。

8.40 SpringMVC的工作原理

  • (1)用户向服务器发送请求,请求被SpringMVC的前端控制器DispatcherServlet捕获;
  • (2)DispatcherServlet对请求URL进行解析,得到请求资源标识符(URL),然后根据该URL调用HandlerMapping将请求映射到处理器HandlerExcutionChain;
  • (3)DispatcherServlet根据获得的Handler选择一个合适的HandlerAdapter处理器适配器进行处理;
  • (4)Handler对数据处理完成后返回一个ModelAndView()对象给DispatcherServlet;
  • (5)Handler返回的ModelAndView只是一个逻辑视图并不是一个真正的视图,DispatcherServlet通过ViewResolver视图解析器将逻辑视图ModelAndView转化为真正的视图View;
  • (6)DispathcerServlet通过Model解析出ModelAndView中的参数进行解析最终展现出完整的View并返还给客户端。
    SpringMVC执行时序图

8.41 谈谈你对Spring的理解

  • Spring是一个开源的框架,为简化企业级应用开发而生。Spring可以使用简单的JavaBean实现以前只有EJB才能实现的功能。Spring是一个IOC和AOP容器框架。
  • Spring容器的主要核心是;
    – 控制反转(IOC),传统的java开发模式中,当需要一个对象的时候,我们会使用new或者getInstance等直接或者间接调用构造器创建一个对象 。而在Spring开发模式中,spring容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用spring提供的对象就可以了,这就是反转控制的思想。
    – 依赖注入(DI),spring使用JavaBean对象的Set方法或者带参数的构造方法为我们创建所需要的对象时,将其属性自动设置所需要的值的过程,就是依赖注入的思想。
    – 面向切面编程(AOP),在面向对象编程(OOP)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象的某些类似的方面横向抽成 一个切面,对这个切面进行一些如权限控制、事务管理、记录日志等等公用操作处理的过程就是面向切面编程的思想。AOP底层是动态代理,如果是接口采用JDK动态代理,如果是类采用CGLIB动态代理。

8.42 Spring中常用的设计模式

  • (1)代理模式:spring中有两种代理方式。如果目标对象实现了若干接口,spring使用jdk的java.lang.reflect.Proxy类代理。如果目标对象没有实现任何接口,spring使用CGLIB库生成目标类的子类
  • (2)单例模式:在spring的配置文件中设置bean默认为单例模式
  • (3)模板方式模式:用来解决代码重复的问题。如:RestTemplate、JmsTemplate、JpaTemplate
  • (4)工厂模式:在工厂模式中,我们在创建对象时不会将客户端暴露创建逻辑,并且是通过使用同一个接口来指向新创建的对象。Spring中使用beanFactory 来创建对象的实例 。

8.43 描述一下Spring的事务管理

  • (1)声明式事务管理的定义:用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不入侵开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实也是如此,因为事务管理是属于系统层面的服务 ,而不是业务逻辑的一部分,如果想要改变事务管理 策划的话,也只需要在定义文件中重新配置即可,这样维护起来极其方便。
    –基于TransactionInteceptor的声明式事务管理:两个次要的属性:transactionManager,用来指定一个事务管理器,并将具体事务的相关操作委托给它;其他是一个Properties类型的transactionAttributes属性,该属性的每一个键值对中,键指定的是方法名,方法名可以行驶通配符,而值就是表现呼应方法的所运用的事务属性。
  • (2)基于@Transaction的声明式事务:Spring 2.x还引入了基于Annotation的提示格式,具体要触及@Transaction标注。@Transaction可以浸染于接口、接口方法、类和类方法上。作用与该类上时,该类的一切public方法将具有该类型的事务属性。
  • (3)编程式事务管理的定义:在代码中显式挪用beginTransaction()、commit()、rollback()等事务治理相关的方法,这就是编程式事务管理。Spring对事物的编程式管理有基于底层的API的编程式管理和基于TransactionTemplate的编程式管理两种方式。
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值