java实习生面试Spring框架篇

什么是 Spring 框架?
Spring 是⼀种轻量级开发框架,旨在提⾼开发⼈员的开发效率以及系统的可维护性。
Spring的6个特征:
核⼼技术 :依赖注⼊(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。
测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。
数据访问 :事务,DAO⽀持,JDBC,ORM,编组XML。
Web⽀持 : Spring MVC和Spring WebFlux Web框架。
集成 :远程处理,JMS,JCA,JMX,电⼦邮件,任务,调度,缓存。
语⾔ :Kotlin,Groovy,动态语⾔。

@RestController vs @Controller
Controller 返回⼀个⻚⾯
单独使⽤ @Controller 不加 @ResponseBody 的话⼀般使⽤在要返回⼀个视图的情况,这种情况属于比较传统的Spring MVC 的应⽤,对应于前后端不分离的情况。
@RestController 返回JSON 或 XML 形式数据
但 @RestController 只返回对象,对象数据直接以 JSON 或 XML 形式写⼊ HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是⽬前⽇常开发所接触的最常⽤的情况(前后端分离)。
@Controller +@ResponseBody 返回JSON 或 XML 形式数据
如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使⽤ @Controller 并结
合 @ResponseBody 注解,也就是说 @Controller + @ResponseBody =
@RestController (Spring 4 之后新加的注解)。

IoC
IoC(Inverse of Control:控制反转)是⼀种设计思想,就是 将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤,并⾮ Spring 特有。 IoC 容器是 Spring⽤来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注⼊。这样可以很⼤程度上简化应⽤的开发,把应⽤从复杂的依赖关系中解放出来。 IoC 容器就像是⼀个⼯⼚⼀样,当我们需要创建⼀个对象的时候,只需要配置好配置⽂件/注解即可,完全不⽤考虑对象是如何被创建出来的。

AOP
AOP(Aspect-Oriented Programming:⾯向切⾯编程)能够将那些与业务⽆关,却为业务模块所共同调⽤的逻辑或责任(例如事务处理、⽇志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring 中的 bean 的作⽤域有哪些?
singleton : 唯⼀ bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建⼀个新的 bean 实例。
request : 每⼀次HTTP请求都会产⽣⼀个新的bean,该bean仅在当前HTTP request内有效。
session : 每⼀次HTTP请求都会产⽣⼀个新的 bean,该bean仅在当前 HTTP session 内有效。
global-session: 全局session作⽤域,仅仅在基于portlet的web应⽤中才有意义,Spring5已
经没有了。Portlet是能够⽣成语义代码(例如:HTML)⽚段的⼩型Java Web插件。它们基于
portlet容器,可以像servlet⼀样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有
不同的会话

@Component 和 @Bean 的区别是什么?

  1. 作⽤对象不同: @Component 注解作⽤于类,⽽ @Bean 注解作⽤于⽅法。
  2. @Component 通常是通过类路径扫描来⾃动侦测以及⾃动装配到Spring容器中(我们可以使⽤@ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类⾃动装配到 Spring 的bean 容器中)。 @Bean 注解通常是我们在标有该注解的⽅法中定义产⽣这个 bean, @Bean 告诉了Spring这是某个类的示例,当我需要⽤它的时候还给我。
  3. @Bean 注解⽐ Component 注解的⾃定义性更强,⽽且很多地⽅我们只能通过 @Bean 注解来注册bean。⽐如当我们引⽤第三⽅库中的类需要装配到 Spring 容器时,则只能通过
    @Bean 来实现。

将⼀个类声明为Spring的 bean 的注解有哪些?
我们⼀般使⽤ @Autowired 注解⾃动装配 bean,要想把类标识成可⽤于 @Autowired 注解⾃动装配的 bean 的类,采⽤以下注解可实现:
@Component :通⽤的注解,可标注任意类为 Spring 组件。如果⼀个Bean不知道属于哪个
层,可以使⽤ @Component 注解标注。
@Repository : 对应持久层即 Dao 层,主要⽤于数据库相关操作。
@Service : 对应服务层,主要涉及⼀些复杂的逻辑,需要⽤到 Dao层。
@Controller : 对应 Spring MVC 控制层,主要⽤户接受⽤户请求并调⽤ Service 层返回数
据给前端⻚⾯。

一个 SpringBean 定义包含什么?
一个 SpringBean 的定义包含容器必知的所有配置元数据,包括如何创建一个 bean,它的生
命周期详情及它的依赖。

什么是 bean 的自动装配?
无须在 Spring 配 置 文 件 中 描 述 javaBean 之 间 的 依 赖 关 系 ( 如 配 置 、
)。IOC 容器会自动建立 javabean 之间的关联关系。

什么是 SpringIOC 容器?
IOC 控制反转:SpringIOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

IOC 的优点是什么?
IOC 或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC 容器支持加载服务时的饿汉式初始化和懒加载。

有哪些不同类型的 IOC(依赖注入)方式?
Spring 提供了多种依赖注入的方式。

  1. Set 注入:Setter 方法注入是容器通过调用无参构造器或无参 static 工厂方法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注入。
  2. 构造器注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
  3. 基于注解的注⼊

Spring 的常用注解
@Required:该注解应用于设值方法
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired 搭配使用,用于消除特定 bean 自动装配的歧义。

Spring 的通知是什么?有哪几种类型?
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架
触发的代码段。Spring 切面可以应用五种类型的通知:
1)before:前置通知,在一个方法执行前被调用。
2)after:在方法执行之后调用的通知,无论方法执行是否成功。
3)after-returning:仅当方法成功完成后执行的通知。
4)after-throwing:在方法抛出异常退出时执行的通知。
5)around:在方法执行之前和之后调用的通知。

解释 JDBC 抽象和 DAO 模块。
通过使⽤JDBC 抽象和 DAO 模块,保证数据库代码的简介,并能避免数据库资源错误关闭
导致的问题,它在各种不同的数据库的错误信息之上,提供了⼀个统⼀的异常访问层。它还利⽤Spring 的 AOP 模块给 Spring 应⽤中的对象提供事务管理服务。

解释对象/关系映射集成模块。
Spring 通过提供 ORM 模块,支持我们在直接 JDBC 之上使用一个对象/关系映射映射(ORM)工具,Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATISSQLMaps。Spring 的事务管理同样支持以上所有 ORM 框架及 JDBC。

Spring 框架中⽤到了哪些设计模式?
⼯⼚设计模式 : Spring使⽤⼯⼚模式通过 BeanFactory 、 ApplicationContext 创建bean 对象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的 Bean 默认都是单例的。
包装器设计模式 : 我们的项⽬需要连接多个数据库,⽽且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的⼀个应⽤。
适配器模式 :Spring AOP 的增强或通知(Advice)使⽤到了适配器模式、spring MVC 中也是⽤到了适配器模式适配 Controller 。

java实习生面试Spring框架篇

什么是 Spring 框架?
Spring 是⼀种轻量级开发框架,旨在提⾼开发⼈员的开发效率以及系统的可维护性。
Spring的6个特征:
核⼼技术 :依赖注⼊(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。
测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。
数据访问 :事务,DAO⽀持,JDBC,ORM,编组XML。
Web⽀持 : Spring MVC和Spring WebFlux Web框架。
集成 :远程处理,JMS,JCA,JMX,电⼦邮件,任务,调度,缓存。
语⾔ :Kotlin,Groovy,动态语⾔。

@RestController vs @Controller
Controller 返回⼀个⻚⾯
单独使⽤ @Controller 不加 @ResponseBody 的话⼀般使⽤在要返回⼀个视图的情况,这种情况属于比较传统的Spring MVC 的应⽤,对应于前后端不分离的情况。
@RestController 返回JSON 或 XML 形式数据
但 @RestController 只返回对象,对象数据直接以 JSON 或 XML 形式写⼊ HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是⽬前⽇常开发所接触的最常⽤的情况(前后端分离)。
@Controller +@ResponseBody 返回JSON 或 XML 形式数据
如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使⽤ @Controller 并结
合 @ResponseBody 注解,也就是说 @Controller + @ResponseBody =
@RestController (Spring 4 之后新加的注解)。

IoC
IoC(Inverse of Control:控制反转)是⼀种设计思想,就是 将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤,并⾮ Spring 特有。 IoC 容器是 Spring⽤来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注⼊。这样可以很⼤程度上简化应⽤的开发,把应⽤从复杂的依赖关系中解放出来。 IoC 容器就像是⼀个⼯⼚⼀样,当我们需要创建⼀个对象的时候,只需要配置好配置⽂件/注解即可,完全不⽤考虑对象是如何被创建出来的。

AOP
AOP(Aspect-Oriented Programming:⾯向切⾯编程)能够将那些与业务⽆关,却为业务模块所共同调⽤的逻辑或责任(例如事务处理、⽇志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring 中的 bean 的作⽤域有哪些?
singleton : 唯⼀ bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建⼀个新的 bean 实例。
request : 每⼀次HTTP请求都会产⽣⼀个新的bean,该bean仅在当前HTTP request内有效。
session : 每⼀次HTTP请求都会产⽣⼀个新的 bean,该bean仅在当前 HTTP session 内有效。
global-session: 全局session作⽤域,仅仅在基于portlet的web应⽤中才有意义,Spring5已
经没有了。Portlet是能够⽣成语义代码(例如:HTML)⽚段的⼩型Java Web插件。它们基于
portlet容器,可以像servlet⼀样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有
不同的会话

@Component 和 @Bean 的区别是什么?

  1. 作⽤对象不同: @Component 注解作⽤于类,⽽ @Bean 注解作⽤于⽅法。
  2. @Component 通常是通过类路径扫描来⾃动侦测以及⾃动装配到Spring容器中(我们可以使⽤@ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类⾃动装配到 Spring 的bean 容器中)。 @Bean 注解通常是我们在标有该注解的⽅法中定义产⽣这个 bean, @Bean 告诉了Spring这是某个类的示例,当我需要⽤它的时候还给我。
  3. @Bean 注解⽐ Component 注解的⾃定义性更强,⽽且很多地⽅我们只能通过 @Bean 注解来注册bean。⽐如当我们引⽤第三⽅库中的类需要装配到 Spring 容器时,则只能通过
    @Bean 来实现。

将⼀个类声明为Spring的 bean 的注解有哪些?
我们⼀般使⽤ @Autowired 注解⾃动装配 bean,要想把类标识成可⽤于 @Autowired 注解⾃动装配的 bean 的类,采⽤以下注解可实现:
@Component :通⽤的注解,可标注任意类为 Spring 组件。如果⼀个Bean不知道属于哪个
层,可以使⽤ @Component 注解标注。
@Repository : 对应持久层即 Dao 层,主要⽤于数据库相关操作。
@Service : 对应服务层,主要涉及⼀些复杂的逻辑,需要⽤到 Dao层。
@Controller : 对应 Spring MVC 控制层,主要⽤户接受⽤户请求并调⽤ Service 层返回数
据给前端⻚⾯。

一个 SpringBean 定义包含什么?
一个 SpringBean 的定义包含容器必知的所有配置元数据,包括如何创建一个 bean,它的生
命周期详情及它的依赖。

什么是 bean 的自动装配?
无须在 Spring 配 置 文 件 中 描 述 javaBean 之 间 的 依 赖 关 系 ( 如 配 置 、
)。IOC 容器会自动建立 javabean 之间的关联关系。

什么是 SpringIOC 容器?
IOC 控制反转:SpringIOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

IOC 的优点是什么?
IOC 或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC 容器支持加载服务时的饿汉式初始化和懒加载。

有哪些不同类型的 IOC(依赖注入)方式?
Spring 提供了多种依赖注入的方式。

  1. Set 注入:Setter 方法注入是容器通过调用无参构造器或无参 static 工厂方法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注入。
  2. 构造器注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
  3. 基于注解的注⼊

Spring 的常用注解
@Required:该注解应用于设值方法
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired 搭配使用,用于消除特定 bean 自动装配的歧义。

Spring 的通知是什么?有哪几种类型?
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架
触发的代码段。Spring 切面可以应用五种类型的通知:
1)before:前置通知,在一个方法执行前被调用。
2)after:在方法执行之后调用的通知,无论方法执行是否成功。
3)after-returning:仅当方法成功完成后执行的通知。
4)after-throwing:在方法抛出异常退出时执行的通知。
5)around:在方法执行之前和之后调用的通知。

解释 JDBC 抽象和 DAO 模块。
通过使⽤JDBC 抽象和 DAO 模块,保证数据库代码的简介,并能避免数据库资源错误关闭
导致的问题,它在各种不同的数据库的错误信息之上,提供了⼀个统⼀的异常访问层。它还利⽤Spring 的 AOP 模块给 Spring 应⽤中的对象提供事务管理服务。

解释对象/关系映射集成模块。
Spring 通过提供 ORM 模块,支持我们在直接 JDBC 之上使用一个对象/关系映射映射(ORM)工具,Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATISSQLMaps。Spring 的事务管理同样支持以上所有 ORM 框架及 JDBC。

Spring 框架中⽤到了哪些设计模式?
⼯⼚设计模式 : Spring使⽤⼯⼚模式通过 BeanFactory 、 ApplicationContext 创建bean 对象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的 Bean 默认都是单例的。
包装器设计模式 : 我们的项⽬需要连接多个数据库,⽽且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的⼀个应⽤。
适配器模式 :Spring AOP 的增强或通知(Advice)使⽤到了适配器模式、spring MVC 中也是⽤到了适配器模式适配 Controller 。