Spring全家桶 面试题总结

*Spring全家桶*

*Spring:*

1、 *Spring是什么?*

Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于****应用程序的开发****。

2、 *spring的作用?*

Spring可以做很多事情,它为企业级开发提供了丰富的功能,方便解耦,简化开发,AOP编程支持,声明式事务支持,集成Junit更加方便的进行分层测试,方便集成各种优秀框架.

这些功能的底层都依赖它的两个核心特性D1,也就是依赖注入和面向切片编程AOP;

Spring通过IoC容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IoC容器,实现解耦;

3、 *spring的优缺点是什么?*

*优点:*

ta有点很多,比如方便解耦、简化开发、

AOP编程支持方便的实现对程序进行权限拦截、运行监控等,

声明式事务支持:只需要配置就可以完成对事务的管理,不用手动编程,

集成Junit更加方便的进行分层测试,方便集成各种优秀框架.

*缺点:*

spring明明是一个轻量级框架,给人的感觉却是大而全,使用门槛升高,入门spring需要较长的时间,还有就是他的依赖反射影响性能;

4、 *Spring的应用场景:(了解)*

javaEE企业应用开发,包括ssm和ssh;

5、 *谈谈你对IOC的理解:*

IOC(控制反转)就是将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC在其他语言中也有应用,并非Spring特有。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象。

将对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。在实际项目中一个Service类可能由几百甚至上千个类作为它的底层,假如我们需要实例化这个Service,可能要每次都搞清楚这个Service所有底层类的构造函数,这可能会把人逼疯。如果利用IOC的话,你只需要配置好,然后在需要的地方引用就行了,大大增加了项目的可维护性且降低了开发难度。

6、 *Spring框架中用到了哪些设计模式?(了解)*

工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;

单例模式、代理模式;

7、 *spring中的通知是?*

通知是个在方法执行前或执行后要做的动作,Spring切面可以应用五种类型的通知,

before前置通知,在一个方法执行前被调用。

after后置通知:在方法成功完成后执行是否成功。

after-returning返回通知:当方法完成后执行的通知。

after-throwing异常通知:在方法抛出异常退出时执行的通知。

around环绕通知:在方法执行之前和执行之后调用的通知。

8、 *Spring支持的事务管理类型是?你更倾向用哪种事务管理类型?*

a、编程式事务管理是通过编程的方式管理事务,能带来极大的灵活性,但是难维护。

b、声明式事务管理,可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。

9、 *Spring AOP*

AOP一般称为面向切面编程,它是对OOP面向对象编程的一种补充延伸、用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”,

他的好处在于减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理等。

10、 *什么是DI?依赖注入的三种实现方式?*

DI是属性的依赖注入,Spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性注入 ;

他有三种实现方式别是、构造器注入,Setter方法注入,接口注入 ,在 Spring Framework 中,仅使用构造函数和 setter 注入。

——————————————————————————————————————

*SpringMVC:*

SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整合

1、 *SpringMVC的工作原理是?*

a、客户端发送请求到 前端控制器(DispatcherServlet)

b、前端控制器(DispatcherServlet)查询 handlerMapping 找到处理请求的 页面控制器(Controller )

c、页面控制器(Controller ) 调用业务逻辑后,返回 ModelAndView

d、前端控制器(DispatcherServlet) 查询 ModelAndView,找到指定视 图

e、视图将结果返回到客户端;

2、 *SpringMVC的执行流程是什么?*

第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器收到请求后调用(处理器适配器)HandlerMapping查找 Handler

第三步:处理器映射器HandlerMapping向前端控制器返回Handler

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView

第八步:前端控制器请求视图解析器去进行视图解析

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染把模型数据填充至视图中。

第十一步:最后,前端控制器向用户响应结果

3、 *SpringMVC的优点是?*

它是基于组件技术的,全部的应用对象,无论控制器和视图还是业务对象之类的都是java组件,并且和sprin提供的其他基础结构紧密集成。

他可以任意使用各种视图技术,且不仅仅局限于jsp,

他支持各种请求资源的映射策略

他易于扩展;

4、 *springMVC的主要组键?*

前端控制器:DispatcherServlet

作用:接收请求、响应结果相当于转发器,有了前端控制器就减少了其他组件之间的耦合度。

处理器映射器:HandlerMapping。

作用:根据请求的URL查找Handler.

处理器适配器:HandlerAdapter

编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器才可以正确的执行Handler。

处理器:Handler(需要程序员编写)

视图解析器 :ViewResolver

作用:进行适度的解析 根据视图逻辑名解析成真正的视图(view)。

视图:View(需要程序员开发jsp)。

解释:view是一个接口,它的实现类支持不同的视图类型(jsp、freemarker、pdf)等。

*5、SpringMVC 中函数的返回值是什么?*

返回值可以有很多类型,有 String, ModelAndView,当一般用 String 比较好

*6、SpringMVC 怎么样设定重定向和转发的?*

在返回值前面加"forward:"就可以让结果转发。

在返回值前面加"redirect:"就可以让返回值 重定向。

*7、SpringMVC 怎么和 AJAX 相互调用的?*

Spring MVC 的默认 json 解析器就是Jackson (杰克森)框架通过Jackson框架

就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象。

具体步骤如下 :

加入 Jackson.jar-----在配置文件中配置 json 的映射

在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上@ResponseBody

*8、如何解决POST请求中文乱码问题,GET的又如何处理呢?*

解决post问题:在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;

解决get请求中文乱码问题有两个:

①修改tomcat配置文件添加编码与工程编码一致

②另外一种方法对参数进行重新编码;.getBytes(“ISO8859- 1”),“utf-8”);

*9、@RequestMapping 注解用在类上面有什么作用?*

是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

*10、SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?*

是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。

*11.、怎么样在方法里面得到 Request,或者 Session?*

直接在方法的形参中声明 request,SpringMvc 就自动把 request 对象传入

*12.如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?*

直接在方法中声明这个对象,SpringMvc 就自动会把属性赋值到这个对象里面。

————————————————————————————————————————

*Mybatis:*

Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,使开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。

*1、Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?*

a | set | foreach | if | choose | when | otherwise | bind。

其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的能。

*2、#{}和${}的区别是什么?*

#{}是预编译处理,${}是字符串替换。

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;

Mybatis 在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值。

使用#{}可以有效的防止 SQL 注入,提高系统安全性。

*3、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?*

Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获 取,所以它是全自动的。

而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。

*4、Mybatis的好处是什么?*

MyBatis 把 sql 语句从 Java 源程序中独立出来,放在单独的 XML 文件中编写,给程序的维护带来了很大便利。

MyBatis 封装了底层 JDBC API 的调用细节,并能自动将结果集转换成 Java Bean 对象, 大大简化了 Java 数据库编程的 重复工作。

缺点:

SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

*5、什么是 MyBatis 的接口绑定,有什么好处?*

接口映射就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑定,我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可以有更加灵活的选择和设置.

*6.接口绑定有几种实现方式,分别是怎么实现的?*

接口绑定有两种实现方式,

一种是通过注解绑定,就是在接口的方法上面加上@Select@Update 等注解里面包含 Sql 语句来绑定,。

另外一种就是通过 xml 里面写 SQL 来绑定,在这种情况下,要指定 xml 映射文件里面的 namespace 必须为接口的全路径名。

*7.当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?*

通过在查询的 sql 语句中定义字段名的别名。

通过来映射字段名和实体类属性名的一一对应的关系。

*8.Mapper DAO层开发规范*

接口的全路径要和映射文件的namespace保持一致。

接口的方法名要和映射文件中的statementId保持一致 。

接口方法的参数类型,返回类型要和映射文件中的parameterType,resultType保持一致。

接口和映射文件的名字最好保持一致 例如:UserMapper.java/UserMapper.xml。

接口和映射文件最好放到同一个目录。

*9、Mybatis的一级、二级缓存:*

(1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

(2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

(3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存,则只根据配置判断是否刷新。

*10、MyBatis 与 Hibernate 有哪些不同?*

Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,不过 mybatis 可以 通过 XML 或注解方式灵活配置要运行的 sql 语句,并将java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再 映射生成 java 对象。

Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性能,灵活度高,非常适合对关系数据模 型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。 但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 sql 映射文件,工作量大。

Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映 射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。总之,按照用户的需求在有限 的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

*Spring Boot:*

1. *什么是 Spring Boot?*

随着新功能的增加,spring 变得越来越复杂。只需访问 https://spring.io/projects页面,我们就会看到可以在我们的 应用程序中使用的所有 Spring 项目的不同功能。如果必须启动一个新的 Spring 项目,我们必须添加构建路径或添加 Maven 依赖关系,配置应用程序服务器,添加 spring 配置。因此,开始一个新的 spring 项目需要很多努力,因为我们现在必须从头开始做 所有事情。 Spring Boot 是解决这个问题的方法。Spring Boot 已经建立在现有 spring 框架之上。使用spring 启动,我们避免了之前我们 必须做的所有样板代码和配置。因此,Spring Boot 可以帮助我们以最少的工作量,更加健壮地使用现有的 Spring 功能。

*2、Spring Boot 有哪些特点 ?*

为 Spring 开发提供一个更快、更广泛的入门体验。

开箱即用,远离繁琐的配置。

提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置 等。

绝对没有代码生成,也不需要XML配置。

*3.Spring Boot 有哪些优点?*

减少开发,测试时间和努力。

使用 JavaConfig 有助于避免使用 XML。

避免大量的 Maven 导入和各种版本冲突。

通过提供默认值快速开始开发。没有单独的 Web 服务器需要。这意味着你不再需要启动 Tomcat,Glassfish 或其他任何东 西。

需要更少的配置 因为没有 web.xml 文件。只需添加用@ Configuration 注释的类,然后添加用@Bean 注释的方法, Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired 添加到 bean 方法中,以使 Spring 自动装入 需要的依赖关系中。基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序:-Dspring.profiles.active = {enviornment}。在加载主应用程序属性文件后,Spring 将在(application{environment} .properties)中加载后续的应用程 序属性文件。

5、 *Spring Boot、Spring MVC 和 Spring 有什么区别?*

Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。

当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。

Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet , MoudlAndView 和ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。

Spring 和 SpringMVC 的问题在于需要配置大量的参数。Spring Boot 通过一个自动配置和启动的项来目解决这个问题。 为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。

*5.Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?*

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,

主要组合包含了以下 3 个注解

@SpringBootConfiguration: 组 合 了 @Configuration 注 解 , 实 现 配 置 文 件 的 功 能 。 @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

@ComponentScan:Spring组件扫描。

*6.Spring Boot 需要独立的容器运行吗?*

可以不需要,内置了 Tomcat/ Jetty 等容器。

*7.你如何理解 Spring Boot 中的 Starters?*

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要 到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用 了。

*8.Spring Boot 是否可以使用 XML 配置 ?*

Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解 可以引入一个 XML 配置。

*9.bootstrap.properties 和 application.properties 有何区别 ?*

单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在结合 Spring Cloud 时,这个配置就 会经常遇到了,特别是在需要加载一些远程配置文件的时侯。bootstrap.properties 在 application.properties 之前加载,配 置在应用程序上下文的引导阶段生效。

一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。bootstrap.properties 被 Spring ApplicationContext 的 父类加载,这个类先于加载 application.properties 的 ApplicatonContext 启动。当然,前面叙述中的 properties 也可以修改 为 yaml 。

*11.如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?*

这可以使用 DEV 工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式 tomcat将重新启动。

Spring Boot 有一个开 发工具(DevTools)模块,它有助于提高开发人员的生产力。Java 开发人员面临的一个主要挑战是将文件更改自动部署到服务器并 自动重启服务器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需 要。Spring Boot 在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools 模块完全满足开发人员的需 求。该模块将在生产环境中被禁用。它还提供 H2 数据库控制台以更好地测试应用程序。

org.springframework.boot

spring-boot-devtools

true

*12.如何在自定义端口上运行 Spring Boot 应用程序?*

为了在自定义端口上运行 Spring Boot 应用程序,您可以在 application.properties 中指定端口。server.port = 8090

你可能感兴趣的:(主流框架技术,spring,java)