java面试java中Spring开发框架的常见面试题

Posted 棉花糖灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面试java中Spring开发框架的常见面试题相关的知识,希望对你有一定的参考价值。

spring的两个核心特性: 依赖注入(dependency injection,DI)面向切面编程(aspect-oriented programming,AOP)

1. 依赖注入

传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。

依赖注入指在运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。依赖注入有2种:设置注入和构造器注入。两种注入方式注入的时间不同,通常以设置注入为主,以构造注入为辅。

  • 设置注入是通过set()方法注入被调用者的实例,还需在配置文件的<bean>标签中用<property>标签来指定需要容器注入的属性。配置文件的Bean的class属性值不能是接口,必须是真正的实现类。spring会在创建默认的Bean实例后,调用对应的set()方法为程序注入属性值。
  • 构造器注入是通过构造函数来设置依赖注入,还需在配置文件的<bean>标签中用<constructor-arg>标签来指定需要容器注入的属性。这种方式在构造实例时,就已经为其完成了属性的初始化。

2. 控制反转

控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

3. 面向切面编程

AOP:动态代理

  • 作用:在程序运行期间,不修改源码对已有方法进行增强
  • 优点:减少重复代码、提高开发效率、维护方便

AOP中的名词:

  • 切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。

  • 连接点(Join point):指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。 应用可能有数以千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。

  • 通知(Advice):在AOP术语中,切面的工作被称为通知。

  • 切入点(Pointcut):切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。

  • 引入(Introduction):引入允许我们向现有类添加新方法或属性。

  • 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advice)的对象。它通常是一个代理对象。也有人把它叫做 被通知(adviced) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。

  • 织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。

  • 代理(Proxy):一个类被AOP织入增强后,就产生一个结果代理类

4. spring的组成

  • spring core:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。
  • spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
  • spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。
  • spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于简化JDBC。
  • spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
  • spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。
  • spring test:主要为测试提供支持的,支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。

5. Spring 应用的组件

  • 接口 - 定义功能。
  • Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
  • Bean 配置文件 - 包含类的信息以及如何配置它们。
  • Spring 面向切面编程(AOP) - 提供面向切面编程的功能。
  • 用户程序 - 它使用接口。

6. 五种通知类型

spring提供了5种通知(advice)类型:

  • 环绕通知(interception Around Advice):在目标对象的方法执行前后被调用
  • 前置通知(Before Adivce):在目标对象的方法执行前被调用
  • 后置通知(After Returning Advice):在目标对象的方法执行后被调用
  • 异常通知(Throw Advice):在目标对象的方法抛出异常时被调用
  • 最终通知(Introduction Advice):在目标对象的方法调用完毕后执行

7. 反射

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

java反射:在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法

Java反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类。
  • 在运行时构造任意一个类的对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时调用任意一个对象的方法。

8. 五种Bean的作用域

Spring框架支持以下五种bean的作用域:

  • singleton(默认): bean在每个Spring ioc 容器中只有一个实例。
  • prototype:一个bean的定义可以有多个实例。
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

9. BeanFactory 和 ApplicationContext的区别

spring有两个核心接口:BeanFactory(Bean工厂)和ApplicationContext(应用上下文),都可以当做Spring的容器,后者是前者的子接口。一般在使用时都是用后者,两者的作用都是载入Bean定义信息,装配Bean。

BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。

ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:

  • 继承MessageSource,因此支持国际化。

  • 统一的资源文件访问方式。

  • 提供在监听器中注册bean的事件。

  • 同时加载多个配置文件。

  • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。

ApplicationContext有三个常用的实现类:

  • ClassPathXmlApplicationContext:从类路径中的xml文件载入上下文定义信息
  • FileSystemXmlApplicationContext:从文件系统中的xml文件载入上下文定义信息
  • XmlWebApplicationContext:从web系统中的xml文件载入上下文定义信息

10. 核心容器

spring 核心容器(spring core)提供spring框架的基本功能,其主要组件BeanFactory是工厂模式的实现,它通过控制反转机制,将应用程序配置和依赖性规范与实际的程序代码分离开。开发人员不再创建工厂,而是直接应用spring提供的依赖注入方式。

11. 代理

将 Advice 应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。

Advice + Target Object = Proxy

代理(proxy)有两种方式:静态代理和动态代理,一般使用后者,动态代理可以使得一个处理器(Handler)为各个类服务。使用代理类将记录与业务逻辑无关的动作提取出来,设计为一个服务类,这样的类称为切面(aspect)。

12. bean的自动装配

装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。装配Bean实际功能是告诉容器需要哪些Bean,以及容器如何使用依赖注入,将它们配合起来。bean的依赖关系是指当为一个bean的属性赋值时要用到另外的bean,也称bean的引用,用ref实现。

在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。这意味着 Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上,也可以设定在特定的bean上。

13. @Autowired自动装配注解

@Autowired默认是按照类型装配注入的 。在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:

  • 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;

  • 如果查询的结果不止一个,那么@Autowired会根据名称来查找;

  • 如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。

14. @Autowired和@Resource的区别

  • @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。

  • @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。

15. @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。

16. @RequestMapping 注解的作用

@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:

  • 类级别:映射请求的 URL
  • 方法级别:映射 URL 以及 HTTP 请求方法

17. Spring的事务管理

Spring支持两种类型的事务管理:

编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。

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

以上是关于java面试java中Spring开发框架的常见面试题的主要内容,如果未能解决你的问题,请参考以下文章

Spring常见面试题

有关vue的常见面试题(上)

什么是spring 最新面试题答案

Java中的常见面试题

java开发面试题:spring面试题总结

Spring面试题汇总2:SpringMVC常见面试题