Spring 面试题(一)
- 1. 为什么要使用 spring?
- 2. 解释一下什么是 Aop?
- 3. 解释一下什么是 ioc?
- 4. spring 有哪些主要模块?
- 5. spring 常用的注入方式有哪些?
- 6. spring 中的 bean 是线程安全的吗?
- 7. spring 支持几种 bean 的作用域?
- 8. spring 自动装配 bean 有哪些方式?
- 9. spring 事务实现方式有哪些?
- 10. 说一下 spring 的事务隔离?
- 11 、不同版本的 Spring Framework 有哪些主要功能?
- 12 、什么是 Spring Framework?
- 13 、列举 Spring Framework 的优点。
- 14 、Spring Framework 有哪些不同的功能?
- 15 、Spring Framework 中有多少个模块,它们分别是什么?
- · Spring Core
- · JDBC (Java DataBase Connectivity)
- · Web
- AOP
- 16 、什么是 Spring 配置文件?
- 17 、Spring 应用程序有哪些不同组件?
- · Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
- 18 、使用 Spring 有哪些方式?
- · 作为一个成熟的 Spring Web 应用程序。
- · 作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)。
- 20、依赖注入(Ioc)
- 21、什么是 Spring IOC 容器?
- 22、什么是依赖注入?
- 23、可以通过多少种方式完成依赖注入?
- · setter 注入
- 24 、区分构造函数注入和 setter 注入。
- 25 、spring 中有多少种 IOC 容器?
- 26 、区分 BeanFactory 和 ApplicationContext。
- 27、列举 IoC 的一些好处。
- · 它将最小化应用程序中的代码量。
- 28、Spring IoC 的实现机制。
- 30、Beans
- 31 、什么是 spring bean?
- 32 、spring 提供了哪些配置方式?
- 33 、spring 支持集中 bean scope?
- 34 、spring bean 容器的生命周期是什么样的?
- 35 、什么是 spring 的内部 bean?
- 36 、什么是 spring 装配
- 37、自动装配有哪些方式?
- 38、自动装配有什么局限?
- 40、注解
- 41、什么是基于注解的容器配置
- 42、如何在 spring 中启动注解装配?
- 43 、@Component, @Controller, @Repository,
- 44 、 [ @Required ](https://www.yuque.com/yevxum/bd3ufw/ytt7gf/pdf?toc=false&key=exports%3Adocx%3Adoc%3A2456644%3A1566790188000&x-yuque-fc-token=xa-KwZfJsLj7JPG0Z6MoLA%3D%3D%7C5dmVbAUI-5hvwkn6L5Vz1aqe2KWsJfck6E1Tg2cTaZM%3D) 注解有什么用?
- 45 、 [ @Autowired ](https://www.yuque.com/yevxum/bd3ufw/ytt7gf/pdf?toc=false&key=exports%3Adocx%3Adoc%3A2456644%3A1566790188000&x-yuque-fc-token=xa-KwZfJsLj7JPG0Z6MoLA%3D%3D%7C5dmVbAUI-5hvwkn6L5Vz1aqe2KWsJfck6E1Tg2cTaZM%3D) 注解有什么用?
- 46 、 [ @Qualifier ](https://www.yuque.com/yevxum/bd3ufw/ytt7gf/pdf?toc=false&key=exports%3Adocx%3Adoc%3A2456644%3A1566790188000&x-yuque-fc-token=xa-KwZfJsLj7JPG0Z6MoLA%3D%3D%7C5dmVbAUI-5hvwkn6L5Vz1aqe2KWsJfck6E1Tg2cTaZM%3D) 注解有什么用?
- 47 、 [ @RequestMapping ](https://www.yuque.com/yevxum/bd3ufw/ytt7gf/pdf?toc=false&key=exports%3Adocx%3Adoc%3A2456644%3A1566790188000&x-yuque-fc-token=xa-KwZfJsLj7JPG0Z6MoLA%3D%3D%7C5dmVbAUI-5hvwkn6L5Vz1aqe2KWsJfck6E1Tg2cTaZM%3D) 注解有什么用?
- 50、数据访问
- 51 、spring DAO 有什么用?
- 52 、列举 Spring DAO 抛出的异常。
- 53 、spring JDBC API 中存在哪些类?
- · JdbcTemplate
- 54 、使用 Spring 访问 Hibernate 的方法有哪些?
- 55、列举 spring 支持的事务管理类型
- 56、spring 支持哪些 ORM 框架
- · Hibernate
- 60、AOP
- 61 、什么是 AOP?
- 62 、什么是 Aspect?
- 可以简单地认为, 使用 [ @Aspect ](https://www.yuque.com/yevxum/bd3ufw/ytt7gf/pdf?toc=false&key=exports%3Adocx%3Adoc%3A2456644%3A1566790188000&x-yuque-fc-token=xa-KwZfJsLj7JPG0Z6MoLA%3D%3D%7C5dmVbAUI-5hvwkn6L5Vz1aqe2KWsJfck6E1Tg2cTaZM%3D) 注解的类就是切面 .
- 63、什么是切点(JoinPoint)
- 64、什么是通知(Advice)?
- 65、有哪些类型的通知(Advice)?
- · Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用
- · After Throwing - 这些类型的 Advice 仅在 joinpoint 方法通过抛出 异常退出并使用 [@AfterThrowing](https://www.yuque.com/yevxum/bd3ufw/ytt7gf/pdf?toc=false&key=exports%3Adocx%3Adoc%3A2456644%3A1566790188000&x-yuque-fc-token=xa-KwZfJsLj7JPG0Z6MoLA%3D%3D%7C5dmVbAUI-5hvwkn6L5Vz1aqe2KWsJfck6E1Tg2cTaZM%3D) 注解标记配置时执行。
- @Around 注解标记进行配置。
- 66、指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处。
- 67、AOP 有哪些实现方式?
- 静态代理
- 动态代理
- · JDK 动态代理
- 68 、Spring AOP and AspectJ AOP 有什么区别?
- 69 、如何理解 Spring 中的代理?
- Advice + Target Object = Proxy
- 69.1、什么是编织(Weaving)?
- 70、MVC
- 71 、Spring MVC 框架有什么用?
- 72 、描述一下 DispatcherServlet 的工作流程
- 成一个对象,将对象转换为指定的响应信息。
- ModelAndView 对象;
- 73 、介绍一下 WebApplicationContext
1. 为什么要使用 spring?
方便解耦,便于开发(Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护都交给spring管理)spring支持aop编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能)声明式事务的支持(通过配置就完成对事务的支持,不需要手动编程)方便程序的测试,spring 对junit4支持,可以通过注解方便的测试spring 程序方便集成各种优秀的框架()降低javaEE API的使用难度(Spring 对javaEE开发中非常难用的一些API 例如JDBC,javaMail,远程调用等,都提供了封装,是这些API应用难度大大降低)
2. 解释一下什么是 Aop?
简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。
这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。
使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。
从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。
这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。从而达到了 将不同的关注点分离出来的效果。
3. 解释一下什么是 ioc?
ioc:Inversionof Control(中文:控制反转)是 spring 的核心,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。
简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理。
通俗地讲:就是把原本你自己制造,使用的对象,现在交由别人制造,而通过构造函数,setter方法或方法(这里指使用这个对象的方法)参数的方式传给你,由你使用。
4. spring 有哪些主要模块?
Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。
Spring CoreCore模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC功能,Sprign的所有功能都是借助IOC实现的。AOPAOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置。ORMSpring 的ORM模块提供对常用的ORM框架的管理和辅助支持,Spring支持常用的Hibernate,ibtas,jdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理DAO模块Spring 提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事物,并不对JDBC进行实现。(执行sql语句)WEB模块WEB模块提供对常见框架如Struts1,WEBWORK(Struts 2),JSF的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器。Context模块Context模块提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的Bean资源,相当于资源注入。MVC模块WEB MVC模块为Spring提供了一套轻量级的MVC实现,在Spring的开发中,我们既可以用Struts也可以用Spring自己的MVC框架,相对于Struts,Spring自己的MVC框架更加简洁和方便。
5. spring 常用的注入方式有哪些?
setter 属性注入构造方法注入注解方式注入
6. spring 中的 bean 是线程安全的吗?
spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。
实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
有状态就是有数据存储功能。无状态就是不会保存数据。
7. spring 支持几种 bean 的作用域?
spring 支持 5 种作用域,如下:
singleton:spring ioc 容器中只存在一个 bean 实例,bean 以单例模式存在,是系统默认值;prototype:每次从容器调用 bean 时都会创建一个新的示例,既每次 getBean()相当于执行 new Bean()操作;Web 环境下的作用域:request:每次 http 请求都会创建一个 bean;session:同一个 http session 共享一个 bean 实例;global-session:用于 portlet 容器,因为每个 portlet 有单独的 session,globalsession 提供一个全局性的 http session。
注意: 使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。
8. spring 自动装配 bean 有哪些方式?
no:默认值,表示没有自动装配,应使用显式 bean 引用进行装配。byName:它根据 bean 的名称注入对象依赖项。byType:它根据类型注入对象依赖项。构造函数:通过构造函数来注入依赖项,需要设置大量的参数。autodetect:容器首先通过构造函数使用 autowire 装配,如果不能,则通过 byType 自动装配。
9. spring 事务实现方式有哪些?
声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。编码方式:提供编码的形式管理和维护事务。
10. 说一下 spring 的事务隔离?
spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:
ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;
ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);
ISOLATIONREADCOMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;
ISOLATIONREPEATABLEREAD:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;
ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
不可重复读 :是指在一个事务内,多次读同一数据。
幻读 :指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
11 、不同版本的 Spring Framework 有哪些主要功能?
Version |
Feature |
Spring 2.5 |
发布于 2007 年。这是第一个支持注解的版本。 |
Spring 3.0 |
发布于 2009 年。它完全利用了 Java5 中的改进,并为 JEE6 提供了支 持。 |
Spring 4.0 |
发布于 2013 年。这是第一个完全支持 JAVA8 的版本。 |
Spring 5.0 |
发布于 2017 年。最低要求支持JDK8+, J2EE 7+ |
Spring 6.0 |
预计 发布于 2022 年。全面兼容JDK17, Springboot 3.0 |
12 、什么是 Spring Framework?
Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度 。它是轻量级、松 散耦合的。 它具有分层体系结构, 允许用户选择组件, 同时还为 J2EE 应用程序 开发提供了一个有凝聚力的框架 。它 可以集成其他框架 ,如 Structs、Hibernate、 EJB 等, 所以又称为框架的框架。
13 、列举 Spring Framework 的优点。
由于 Spring Frameworks 的分层架构, 用户可以*选择自己需要的组件。
Spring Framework 支持 POJO(Plain Old Java Object) 编程 , 从而具备持续集 成和可测试性。 由于依赖注入和控制反转, JDBC 得以简化。 它是开源免费的。
14 、Spring Framework 有哪些不同的功能?
轻量级 - Spring 在代码量和透明度方面都很轻便 。 IOC - 控制反转 AOP - 面向 切面编程可以将应用业务逻辑和系统服务分离 ,以 实现高内聚 。 容 器 - Spring 负 责创建和管理对象( Bean) 的生命周期和配置。 MVC - 对 web 应用提供了高 度可配置性,其他框架的集成也十分方便 。 事务管理 - 提供了用于事务管理的通 用抽象层。 Spring 的事务支持也可用于容器较少的环境。 JDBC 异常 - Spring 的 JDBC 抽象层提供了一个异常层次结构, 简化了错误处理策略。
15 、Spring Framework 中有多少个模块,它们分别是什么?
Spring 核心容器 – 该层基本上是 Spring Framework 的核心。 它包含以下模
块:
· Spring Core
· Spring Bean
· SpEL (Spring Expression Language)
· Spring Context
数据访问 /集成 – 该层提供与数据库交互的支持。 它包含以下模块:
· JDBC (Java DataBase Connectivity)
· ORM (Object Relational Mapping)
· OXM (Object XML Mappers)
· JMS (Java Messaging Service)
· Transaction
Web – 该层提供了创建 Web 应用程序的支持。 它包含以下模块:
· Web
· Web – Servlet
· Web – Socket
· Web – Portlet
AOP
· 该层支持面向切面编程
Instrumentation
· 该层为类检测和类加载器实现提供支持。
Test
· 该层为使用 JUnit 和 TestNG 进行测试提供支持。
几个杂项模块 :
Messaging – 该模块为 STOMP 提供支持。 它还支持注解编程模型, 该模型用
于从 WebSocket 客户端路由和处理 STOMP 消息。 Aspects – 该模块为与 AspectJ 的集成提供支持。
16 、什么是 Spring 配置文件?
Spring 配置文件是 XML 文件 。该文件主要包含类信息 。它描述了这些类是如何 配置以及相互引入的。但是 ,XML 配置文件冗长且更加干净。如果没有正确规划 和编写, 那么在大项目中管理变得非常困难。
17 、Spring 应用程序有哪些不同组件?
Spring 应用一般有以下组件:
· 接口 - 定义功能。
· Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
· Spring 面向切面编程(AOP) - 提供面向切面编程的功能。
· Bean 配置文件 - 包含类的信息以及如何配置它们。
· 用户程序 - 它使用接口。
18 、使用 Spring 有哪些方式?
使用 Spring 有以下方式:
· 作为一个成熟的 Spring Web 应用程序。
· 作为第三方 Web 框架,使用 Spring Frameworks 中间层。
· 用于远程使用。
· 作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)。
20、依赖注入(Ioc)
21、什么是 Spring IOC 容器?
Spring 框架的核心是 Spring 容器 。容器创建对象 ,将它们装配在一起 ,配置它 们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的 组件。 容器通过读取提供的配置元数据来接收对象进行实例化, 配置和组装的指 令。 该元数据可以通过 XML, Java 注解或 Java 代码提供。
22、什么是依赖注入?
在依赖注入中, 您不必创建对象, 但必须描述如何创建它们。 您不是直接在代码
中将组件和服务连接在一起 ,而 是描述配置文件中哪些组件需要哪些服务 。由 IoC 容器将它们装配在一起。
23、可以通过多少种方式完成依赖注入?
通常, 依赖注入可以通过三种方式完成, 即:
· 构造函数注入
· setter 注入
· 接口注入
在 Spring Framework 中, 仅使用构造函数和 setter 注入。
24 、区分构造函数注入和 setter 注入。
构造函数注入 |
setter 注入 |
没有部分注入 |
有部分注入 |
不会覆盖 setter 属性 |
会覆盖 setter 属性 |
任意修改都会创建一个新实例 |
任意修改不会创建一个新实例 |
适用于设置很多属性 |
适用于设置少量属性 |
25 、spring 中有多少种 IOC 容器?
BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类 。它会在客户端
要求时实例化 bean。
ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口 。它 在 BeanFactory 基础上提供了一些额外的功能。
26 、区分 BeanFactory 和 ApplicationContext。
BeanFactory |
ApplicationContext |
它使用懒加载 |
它使用即时加载 |
它使用语法显式提供资源对象 |
它自己创建和管理资源对象 |
不支持国际化 |
支持国际化 |
不支持基于依赖的注解 |
支持基于依赖的注解 |
27、列举 IoC 的一些好处。
IoC 的一些好处是:
· 它将最小化应用程序中的代码量。
· 它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例 或 JNDI 查找机制。
· 它以最小的影响和最少的侵入机制促进松耦合。
· 它支持即时的实例化和延迟加载服务。
28、Spring IoC 的实现机制。
Spring 中的 IoC 的实现原理就是工厂模式加反射机制。
示例:
30、Beans
31 、什么是 spring bean?
· 它们是构成用户应用程序主干的对象。
· Bean 由 Spring IoC 容器管理。
· 它们由 Spring IoC 容器实例化,配置,装配和管理。
· Bean 是基于用户提供给容器的配置元数据创建。
32 、spring 提供了哪些配置方式?
基于 xml 配置
bean 所需的依赖项和服务在 XML 格式的配置文件中指定。 这些配置文件通常 包含许多 bean 定义和特定于应用程序的配置选项。 它们通常以 bean 标签开 头。 例如:
基于注解配置
您可以通过在相关的类, 方法或字段声明上使用注解, 将 bean 配置为组件类本 身, 而不是使用 XML 来描述 bean 装配。 默认情况下, Spring 容器中未打开 注解装配。 因此, 您需要在使用它之前在 Spring 配置文件中启用它。 例如:
基于 Java API 配置
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。 1、 @Bean 注解扮演与 元素相同的角色。
2、 @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法
来定义 bean 间依赖关系。 例如:
33 、spring 支持集中 bean scope?
Spring bean 支持 5 种 scope:
Singleton - 每个 Spring IoC 容器仅有一个单实例。 Prototype - 每次请求都 会产生一个新的实例。 Request - 每一次 HTTP 请求都会产生一个新的实例 ,并 且该 bean 仅在当前 HTTP 请求内有效 。 Session - 每一次 HTTP 请求都会产 生一个新的 bean, 同时该 bean 仅在当前 HTTP session 内有效。
Global-session - 类似于标准的 HTTP Session 作用域, 不过它仅仅在基于
portlet 的 web 应用中才有意义。 Portlet 规范定义了全局 Session 的概念, 它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。 在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范 围内。 如果你在 web 中使用 global session 作用域来标识 bean, 那么 web 会自动当成 session 类型来使用。
仅当用户使用支持 Web 的 ApplicationContext 时, 最后三个才可用。
34 、spring bean 容器的生命周期是什么样的?
spring bean 容器的生命周期流程如下:
1、Spring 容器根据配置中的 bean 定义中实例化 bean。2、Spring 使用依赖 注入填充所有属性, 如 bean 中所定义的配置。 3、 如果 bean 实现
BeanNameAware 接口, 则工厂通过传递 bean 的 ID 来调用
setBeanName()。 4、 如果 bean 实现 BeanFactoryAware 接口, 工厂通过传 递自身的实例来调用 setBeanFactory()。 5、 如果存在与 bean 关联的任何
BeanPostProcessors, 则调用 preProcessBeforeInitialization() 方法。 6、 如 果为 bean 指定了 init 方法( 的 init-method 属性), 那么将调 用它。 7、 最后, 如果存在与 bean 关联的任何 BeanPostProcessors, 则将调
用 postProcessAfterInitialization() 方法。 8、 如果 bean 实现
DisposableBean 接口 ,当 spring 容器关闭时,会调用 destory()。9、如果为 bean 指定了 destroy 方法( 的 destroy-method 属性 ),那么将 调用它。
35 、什么是 spring 的内部 bean?
只有将 bean 用作另一个 bean 的属性时, 才能将 bean 声明为内部 bean。 为了定义 bean, Spring 的基于 XML 的配置元数据在 或
中提供了 元素的使用。 内部 bean 总是匿名 的, 它们总是作为原型。
例如, 假设我们有一个 Student 类, 其中引用了 Person 类。 这里我们将只创 建一个 Person 类实例并在 Student 中使用它。
Student.java
bean.xml
36 、什么是 spring 装配
当 bean 在 Spring 容器中组合在一起时 ,它 被称为装配或 bean 装配 。Spring 容器需要知道需要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定 在一起, 同时装配 bean。
37、自动装配有哪些方式?
Spring 容器能够自动装配 bean。 也就是说 , 可以通过检查 BeanFactory 的内
容让 Spring 自动解析 bean 的协作者。 自动装配的不同模式:
no - 这是默认设置, 表示没有自动装配。 应使用显式 bean 引用进行装配。 byName - 它根据 bean 的名称注入对象依赖项。 它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。 byType - 它根据类型注入对象依赖项 。如果属 性的类型与 XML 文件中的一个 bean 名称匹配 ,则匹配并装配属性 。 构造函数
- 它通过调用类的构造函数来注入依赖项 。它有大量的参数 。 autodetect - 首先 容器尝试通过构造函数使用 autowire 装配 ,如果不能 ,则尝试通过 byType 自 动装配。
38、自动装配有什么局限?
覆盖的可能性 - 您始终可以使用 和 设 置指定依赖项 ,这将覆盖自动装配 。基 本元数据类型 - 简单属性( 如原数据类型 , 字符串和类) 无法自动装配 。 令人困惑的性质 - 总是喜欢使用明确的装配 , 因为 自动装配不太精确。
40、注解
41、什么是基于注解的容器配置
不使用 XML 来描述 bean 装配 ,开发人员通过在相关的类,方法或字段声明上 使用注解将配置移动到组件类本身。 它可以作为 XML 设置的替代方案。 例如:
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。
@Bean 注解扮演与 元素相同的角色。 @Configuration 类允许通过简单地调
用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。 例如:
42、如何在 spring 中启动注解装配?
默认情况下,Spring 容器中未打开注解装配 。因此 ,要使用基于注解装配,我们 必须通过配置 <context: annotation-config/> 元素在 Spring 配置文件 中启用它。
43 、@Component, @Controller, @Repository,
@Service 有何区别?
@Component : 这将 java 类标记为 bean。 它是任何 Spring 管理组件的通 用构造型。 spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境 中。 @Controller : 这将一个类标记为 Spring Web MVC 控制器。 标有它的
Bean 会自动导入到 IoC 容器中。 @Service :此注解是组件注解的特化。它不 会对 @Component 注解提供任何其他行为。 您可以在服务层类中使用
@Service 而不是 @Component, 因为它以更好的方式指定了意图。
@Repository : 这个注解是具有类似用途和功能的 @Component 注解的特 化。 它为 DAO 提供了额外的好处。 它将 DAO 导入 IoC 容器, 并使未经检查 的异常有资格转换为 Spring DataAccessException。
44 、 @Required 注解有什么用?
@Required 应用于 bean 属性 setter 方法。 此注解仅指示必须在配置时使用 bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性。 如果尚未 填充受影响的 bean 属性, 则容器将抛出 BeanInitializationException。
示例:
45 、 @Autowired 注解有什么用?
@Autowired 可以更准确地控制应该在何处以及如何进行自动装配。 此注解用于 在 setter 方法, 构造函数, 具有任意名称或多个参数的属性或方法上自动装配 bean。 默认情况下, 它是类型驱动的注入。
46 、 @Qualifier 注解有什么用?
当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时 ,您 可 以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。
例如, 这里我们分别有两个类, Employee 和 EmpAccount。 在 EmpAccount 中, 使用 @Qualifier 指定了必须装配 id 为 emp1 的 bean。
Employee.java
EmpAccount.java
47 、 @RequestMapping 注解有什么用?
@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的 控制器中的特定类 /方法。 此注释可应用于两个级别:
类级别 : 映射请求的 URL 方法级别 : 映射 URL 以及 HTTP 请求方法
50、数据访问
51 、spring DAO 有什么用?
Spring DAO 使得 JDBC, Hibernate 或 JDO 这样的数据访问技术更容易以一
种统一的方式工作。 这使得用户容易在持久性技术之间切换。 它还允许您在编写 代码时, 无需考虑捕获每种技术不同的异常。
52 、列举 Spring DAO 抛出的异常。
53 、spring JDBC API 中存在哪些类?
· JdbcTemplate
· SimpleJdbcTemplate
· NamedParameterJdbcTemplate
· SimpleJdbcInsert
· SimpleJdbcCall
54 、使用 Spring 访问 Hibernate 的方法有哪些?
我们可以通过两种方式使用 Spring 访问 Hibernate: 1、 使用 Hibernate 模板和回调进行控制反转
2、 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点
55、列举 spring 支持的事务管理类型
Spring 支持两种类型的事务管理:
1、 程序化事务管理: 在此过程中, 在编程的帮助下管理事务。 它为您提供极大 的灵活性, 但维护起来非常困难。
2、 声明式事务管理:在此 ,事务管理与业务代码分离 。仅使用注解或基于 XML 的配置来管理事务。
56、spring 支持哪些 ORM 框架
· Hibernate
· iBatis
· JPA
· JDO
· OJB
60、AOP
61 、什么是 AOP?
AOP(Aspect-Oriented Programming), 即 面向切面编程 , 它与
OOP( Object-Oriented Programming, 面向对象编程 ) 相辅相成 , 提供了与 OOP 不同的抽象软件结构的视角 . 在 OOP 中, 我们以类 (class)作为我们的基 本单元, 而 AOP 中的基本单元是 Aspect(切面 )
62 、什么是 Aspect?
aspect 由 pointcount 和 advice 组成 , 它既包含了横切逻辑的定义 , 也包 括了连接点的定义 . Spring AOP 就是负责实施切面的框架, 它将切面所定义的横 切逻辑编织到切面所指定的连接点中 . AOP 的工作重心在于如何将增强编织目标 对象的连接点上, 这里包含两个工作 :
1、 如何通过 pointcut 和 advice 定位到特定的 joinpoint 上 2、 如何在 advice 中编写切面代码 .
可以简单地认为, 使用 @Aspect 注解的类就是切面 .
63、什么是切点(JoinPoint)
程序运行中的一些时间点, 例如一个方法的执行 , 或者是一个异常的处理 在 Spring AOP 中, join point 总是方法的执行点。
64、什么是通知(Advice)?
特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一 个 Advice 作为拦截器, 在 JoinPoint “ 周围 ” 维护一系列的拦截器。
65、有哪些类型的通知(Advice)?
· Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用
@Before 注解标记进行配置。
· After Returning - 这些类型的 Advice 在连接点方法正常执行后执 行,并使用@AfterReturning 注解标记进行配置。
· After Throwing - 这些类型的 Advice 仅在 joinpoint 方法通过抛出 异常退出并使用 @AfterThrowing 注解标记配置时执行。
· After (finally) - 这些类型的 Advice 在连接点方法之后执行,无论方 法退出是正常还是异常返回,并使用 @After 注解标记进行配置。
· Around - 这些类型的 Advice 在连接点之前和之后执行,并使用
@Around 注解标记进行配置。
66、指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处。
concern 是我们想要在应用程序的特定模块中定义的行为。 它可以定义为我们想 要实现的功能。
cross-cutting concern 是一个适用于整个应用的行为, 这会影响整个应用程序 。 例如 , 日志记录 , 安全性和数据传输是应用程序几乎每个模块都需要关注的问题 , 因此它们是跨领域的问题。
67、AOP 有哪些实现方式?
实现 AOP 的技术, 主要分为两大类:
静态代理
指使用 AOP 框架提供的命令进行编译 ,从 而在编译阶段就可生成 AOP 代理类 , 因此也称为编译时增强;
· 编译时编织(特殊编译器实现)
· 类加载时编织(特殊的类加载器实现)。
动态代理
在运行时在内存中 “ 临时 ” 生成 AOP 动态代理类, 因此也被称为运行时增强。
· JDK 动态代理
· CGLIB
68 、Spring AOP and AspectJ AOP 有什么区别?
Spring AOP 基于动态代理方式实现; AspectJ 基于静态代理方式实现。 Spring AOP 仅支持方法级别的 PointCut; 提供了完全的 AOP 支持 , 它还支持属性级 别的 PointCut。
69 、如何理解 Spring 中的代理?
将 Advice 应用于目标对象后创建的对象称为代理。 在客户端对象的情况下, 目 标对象和代理对象是相同的。
Advice + Target Object = Proxy
69.1、什么是编织(Weaving)?
为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象, 称为编 织( Weaving)。 在 Spring AOP 中, 编织在运行时执行。 请参考下图:
70、MVC
71 、Spring MVC 框架有什么用?
Spring Web MVC 框架提供 模型 -视图 -控制器 架构和随时可用的组件 ,用于开 发灵活且松散耦合的 Web 应用程序。 MVC 模式有助于分离应用程序的不同方
面,如输入逻辑 ,业务逻辑和 UI 逻辑 ,同时在所有这些元素之间提供松散耦合 。
72 、描述一下 DispatcherServlet 的工作流程
DispatcherServlet 的工作流程可以用一幅图来说明:
1、 向服务器发送 HTTP 请求, 请求被前端控制器 DispatcherServlet 捕获 。
2、 DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解 析, 得到请求资源标识符( URI)。 然后根据该 URI, 调用 HandlerMapping 获得该 Handler 配置的所有相关的对象( 包括 Handler 对象以及 Handler 对 象对应的拦截器), 最后以 HandlerExecutionChain 对象的形式返回。
3、 DispatcherServlet 根据获得的 Handler, 选择一个合适的 HandlerAdapter。( 附注 :如果成功获得 HandlerAdapter 后,此时将开始 执行拦截器的 preHandler(…)方法)。
4、 提取 Request 中的模型数据, 填充 Handler 入参, 开始执行 Handler
( Controller)。 在填充 Handler 的入参过程中, 根据你的配置, Spring 将 帮你做一些额外的工作:
· HttpMessageConveter :将请求消息(如 Json、xml 等数据)转换
成一个对象,将对象转换为指定的响应信息。
· 数据转换 :对请求消息进行数据转换。如 String 转换成 Integer、 Double 等。
· 数据根式化 :对请求消息进行数据格式化。如将字符串转换成格式化数字 或格式化日期等。
· 数据验证 :验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。
5、 Handler(Controller)执行完成后, 向 DispatcherServlet 返回一个
ModelAndView 对象;
6、根据返回的 ModelAndView,选择一个适合的 ViewResolver( 必须是已 经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet。
7、 ViewResolver 结合 Model 和 View, 来渲染视图。 8、 视图负责将渲染结果返回给客户端。
73 、介绍一下 WebApplicationContext
WebApplicationContext 是 ApplicationContext 的扩展。 它具有 Web 应用 程序所需的一些额外功能。 它与普通的 ApplicationContext 在解析主题和决定 与哪个 servlet 关联的能力方面有所不同。
英文原文链接:
https://www.edureka.co/blog/interview-questions/spring-interview-questi
如果大家觉得还不错,点赞,收藏,分享,一键三连支持我一下~