> 文章列表 > Spring面试

Spring面试

Spring面试

标题

  • 1、SpringBoot的自动配置原理
  • 2、Spring 中事务的传播行为有哪些?
  • 3、Spring 中 Bean 的作用域有哪些?
  • 4、Spring 中 BeanFactory 和FactoryBean 的区别
  • 5、如何理解 Spring Boot 中的 Starter?
  • 6、@Resource 和 @Autowired 的区别
  • 7、说一说你对Spring AOP的理解
  • 8、说一说你对Spring IOC和DI的理解

1、SpringBoot的自动配置原理

SpringBoot的自动配置原理

2、Spring 中事务的传播行为有哪些?

首选,所谓的事务传播行为,就是多个声明了事务的方法相互调用的时候,这个事务应该如何传播。
比如说,methodA()调用 methodB(),两个方法都显示的开启了事务。
那么 methodB()是开启一个新事务,还是继续在 methodA()这个事务中执行?就取 决 于 事 务 的 传 播 行 为 。
在 Spring 中,定义了 7 种事务传播行为。
Spring面试

3、Spring 中 Bean 的作用域有哪些?

  • singleton,也就是单例,意味着在整个 Spring 容器中只会存在一个 Bean 实例
  • prototype,翻译成原型,意味着每次从 IOC 容器去获取指定 Bean 的时候,都会返回一个新的实例对象
  • request,针对每一次 http 请求,都会创建一个新的 Bean
  • session,以 sesssion 会话为纬度,同一个 session 共享同一个 Bean 实例,不同的 session 产生不同的 Bean 实例
  • globalSession,针对全局 session 纬度,共享同一个 Bean 实例

4、Spring 中 BeanFactory 和FactoryBean 的区别

首先,Spring 里面的核心功能是 IOC 容器,所谓 IOC 容器呢,本质上就是一个
Bean 的容器或者是一个 Bean 的工厂。
它能够根据 xml 里面声明的 Bean 配置进行 bean 的加载和初始化,然后
BeanFactory 来生产我们需要的各种各样的 Bean。
所以我对 BeanFactory 的理解了有两个。
BeanFactory 是所有 Spring Bean 容器的顶级接口,它为 Spring 的容器定义了
一套规范,并提供像 getBean 这样的方法从容器中获取指定的 Bean 实例。
BeanFactory 在产生 Bean 的同时,还提供了解决 Bean 之间的依赖注入的能力,
也就是所谓的 DI。
FactoryBean 是一个工厂 Bean,它是一个接口,主要的功能是动态生成某一个
类型的 Bean 的实例,它允许用户自定义Bean的实例化过程。用户可以实现该接口,定义自己的Bean实例化逻辑,并将其注册到Spring IoC容器中

它里面有一个重要的方法叫 getObject(),这个方法里面就是用来实现动态构建
Bean 的过程。

5、如何理解 Spring Boot 中的 Starter?

6、@Resource 和 @Autowired 的区别

  • @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-250标准中制定的注解类型。JSR是Java规范提案。)
  • @Autowired注解是Spring框架自己的。
  • @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
  • @Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用。
  • @Resource注解用在属性上、setter方法上。
  • @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。

7、说一说你对Spring AOP的理解

AOP(Aspect Oriented Programming)是面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。

AOP的术语:

  • 连接点(join point):对应的是具体被拦截的对象,因为Spring只能支持方法,所以被拦截的对象往往就是指特定的方法,AOP将通过动态代理技术把它织入对应的流程中。

  • 切点(point cut):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点。切点就是提供这样一个功能的概念。(要对哪些连接点进行拦截,即被增强的方法。)

  • 通知(advice):指拦截后要做的事情,即切点被拦截后执行的方法。分为前置通知、后置通知、环绕通知、事后返回通知和异常通知,它会根据约定织入流程中。

  • 目标对象(target):即被代理对象。

  • 引入(introduction):是指引入新的类和其方法,增强现有Bean的功能。

  • 织入(weaving):它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。(生成代理对象的过程)

  • 切面(aspect):切点+通知。

Spring AOP:

AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式。

  • JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。
  • CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。

8、说一说你对Spring IOC和DI的理解

首先,Spring IOC,全称控制反转(Inversion of Control)。在传统的 Java 程序开发中,我们只能通过 new 关键字来创建对象,这种导致程序中对象的依赖关系比较复杂,耦合度较高。
而 IOC 的主要作用是实现了对象的管理,也就是我们把设计好的对象交给了 IOC
容器控制,然后在需要用到目标对象的时候,直接从容器中去获取。有了 IOC 容器来管理 Bean 以后,相当于把对象的创建和查找依赖对象的控制权交给了容器,这种设计理念使得对象与对象之间是一种松耦合状态,极大提升了程序的灵活性以及功能的复用性。

然后,DI 表示依赖注入,也就是对于 IOC 容器中管理的 Bean,如果 Bean 之间
存在依赖关系,那么 IOC 容器需要自动实现依赖对象的实例注入,通常有三种
方法来描述 Bean 之间的依赖关系。

  • 接口注入
  • setter 注入
  • 构造器注入
    另外,为了更加灵活的实现 Bean 实例的依赖注入,Spring 还提供了@Resource和@Autowired 这两个注解。分别是根据 bean 的 id 和 bean 的类型来实现依赖注入