【许愿offer】spring面试问题总结(附答案)

前言:

在这里插入图片描述

Spring 是 个 java 企 业 级 应 用 的 开 源 开 发 框 架 。Spring 主 要 用 来 开 发 Java 应 用 ,但 是 有 些 扩 展 是 针 对 构 建 J2EE 平 台 的 web 应 用 。Spring 框 架 目 标 是 简 化 Java 企业 级 应 用 开 发 , 并 通 过 POJO 为 基 础 的 编 程 模 型 促 进良 好 的 编 程 习 惯 。

另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,下方只是部分截图 想要资料的话也可以点击795983544领取 暗号CSDN。

在这里插入图片描述

1.使 用 Spring 框 架 的 好 处 是 什 么

  • 轻 量 :Spring 是 轻 量 的 , 基 本 的 版 本 大 约 2MB。
  • 控 制 反 转 :Spring 通 过 控 制 反 转 实 现 了 松 散 耦 合 , 对 象们 给 出 它 们 的 依 赖 , 而 不
    是 创 建 或 查 找 依 赖 的 对 象 们 。
  • 面 向 切 面 的 编 程(AOP):Spring 支 持 面 向 切 面 的 编 程 ,并 且 把 应 用 业 务 逻 辑 和 系 统
    服 务 分 开 。
  • 容 器 :Spring 包 含 并 管 理 应 用 中 对 象 的 生 命 周 期 和 配置 。
  • MVC框架:Spring 的 WEB框 架 是 个 精 心 设 计 的 框 架 ,是 Web 框 架 的 一个很好的替代品。
  • 事 务 管 理 :Spring 提 供 一 个 持 续 的 事 务 管 理 接 口 , 可 以扩 展 到 上 至 本 地 事 务 下 至
    全 局 事 务 (JTA) 。
  • 异 常 处 理 :Spring 提 供 方 便 的 API 把 具 体 技 术 相 关 的 异常 ( 比 如 由JDBC,Hibernate or JDO 抛 出 的 ) 转 化 为一 致 的 unchecked 异 常 。

2.什么是 Spring IOC 容器?

Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。

在这里插入图片描述

3.可以通过多少种方式完成依赖注入?

通常,依赖注入可以通过三种方式完成,即:

构造函数注入

setter 注入

接口注入

在 Spring Framework 中,仅使用构造函数和 setter 注入。

4.Spring IoC 的实现机制。

Spring 中的 IoC 的实现原理就是工厂模式加反射机制。
示例:

interface Fruit {
    
    
     public abstract void eat();
}
class Apple implements Fruit {
    
    
    public void eat(){
    
    
        System.out.println("Apple");
    }
}
class Orange implements Fruit {
    
    
    public void eat(){
    
    
        System.out.println("Orange");
    }
}
class Factory {
    
    
    public static Fruit getInstance(String ClassName) {
    
    
        Fruit f=null;
        try {
    
    
            f=(Fruit)Class.forName(ClassName).newInstance();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return f;
    }
}
class Client {
    
    
    public static void main(String[] a) {
    
    
        Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
        if(f!=null){
    
    
            f.eat();
        }
    }
}

5.什么是 spring bean?

它们是构成用户应用程序主干的对象。

Bean 由 Spring IoC 容器管理。

它们由 Spring IoC 容器实例化,配置,装配和管理。

Bean 是基于用户提供给容器的配置元数据创建。

6.spring 提供了哪些配置方式?

基于 xml 配置

bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项。它们通常以 bean 标签开头。例如:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
        <property name="name" value="Edureka"></property>
    </bean>

基于注解配置

您可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。默认情况下,Spring 容器中未打开注解装配。因此,您需要在使用它之前在 Spring 配置文件中启用它。例如:

<beans>
      <context:annotation-config/>
      <!-- bean definitions go here -->
  </beans>

基于 Java API 配置

Spring 的 Java 配置是通过使用@Bean 和 @Configuration 来实现。

  • @Bean 注解扮演与 < bean /> 元素相同的角色。
  • @Configuration 类允许通过简单地调用同一个类中的其他@Bean 方法来定义 bean 间依赖关系。

例如:

public class StudentConfig {
    
       
    @Bean
    public StudentBean myStudent() {
    
    
        return new StudentBean();
    }
}

7.spring bean 容器的生命周期是什么样的?

spring bean 容器的生命周期流程如下:

  • Spring 容器根据配置中的 bean 定义中实例化 bean。
  • Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
  • 如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用 setBeanName()。
  • 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
  • 如果存在与 bean 关联的任何 BeanPostProcessors,则调用
    preProcessBeforeInitialization() 方法。
  • 如果为 bean 指定了 init 方法( < bean> 的 init-method 属性),那么将调用它。
  • 最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用
    postProcessAfterInitialization() 方法。
  • 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
  • 如果为 bean 指定了 destroy 方法( < bean> 的 destroy-method 属性),那么将调用它。
    在这里插入图片描述

8.什么是 spring 的内部 bean?

只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在 < property> 或 < constructor-arg> 中提供了 < bean> 元素的使用。内部 bean 总是匿名的,它们总是作为原型。

例如,假设我们有一个 Student 类,其中引用了 Person 类。这里我们将只创建一个 Person 类实例并在 Student 中使用它。

Student.java

public class Student {
    
    
    private Person person;
    //Setters and Getters
}
public class Person {
    
    
    private String name;
    private String address;
    //Setters and Getters
}
bean.xml

<bean id=“StudentBean" class="com.edureka.Student">
        <property name="person">
            <!--This is inner bean -->
            <bean class="com.edureka.Person">
                <property name="name" value=“Scott"></property>
                <property name="address" value=“Bangalore"></property>
            </bean>
        </property>
    </bean>

9. 什么是 spring 装配

当 bean 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。 Spring 容器需要知道需要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定在一起,同时装配 bean。

10.自动装配有哪些方式?

Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协作者。

自动装配的不同模式:

  • no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。
  • byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。
  • byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。
  • 构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。
  • autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。

11.自动装配有什么局限?

  • 覆盖的可能性 - 您始终可以使用 和 设置指定依赖项,这将覆盖自动装配。
  • 基本元数据类型 - 简单属性(如原数据类型,字符串和类)无法自动装配。
  • 令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。

12.你用过哪些重要的 Spring 注解?

@Controller - 用于 Spring MVC 项目中的控制器类。

@Service - 用于服务类。

@RequestMapping - 用于在控制器处理程序方法中配置 URI 映射。

@ResponseBody - 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。

@PathVariable - 用于将动态值从 URI 映射到处理程序方法参数。

@Autowired - 用于在 spring bean 中自动装配依赖项。

@Qualifier - 使用 @Autowired 注解,以避免在存在多个 bean 类型实例时出现混淆。

@Scope - 用于配置 spring bean 的范围。

@Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。

@Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP)。

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

14.@Required 注解有什么用?

@Required 应用于 bean 属性 setter 方法。此注解仅指示必须在配置时使用 bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性。如果尚未填充受影响的 bean 属性,则容器将抛出 BeanInitializationException。

public class Employee {
    
    
    private String name;
    @Required
    public void setName(String name){
    
    
        this.name=name;
    }
    public string getName(){
    
    
        return name;
    }
}

15.@Autowired 注解有什么用?

@Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配 bean。默认情况下,它是类型驱动的注入。

public class Employee {
    
    
    private String name;
    @Autowired
    public void setName(String name) {
    
    
        this.name=name;
    }
    public string getName(){
    
    
        return name;
    }
}

16.列举 spring 支持的事务管理类型

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

程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维护起来非常困难。

声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML 的配置来管理事务。

spring 支持哪些 ORM 框架
Hibernate

iBatis

JPA

JDO

OJB

17.构造方法注入和设值注入有什么区别

请注意以下明显的区别:

(1)设值注入支持大部分依赖注入,如果我们仅需要注入int、string和long型的变量,不要用设值方法注入。对于基本类型,如果没有注入,可以为基本类型设置默认值。构造方法注入不支持大部分依赖注入,因为在调用构造方法时必须传入正确的构造参数,否则会报错。
(2)设值注入不会重写构造方法的值。如果我们对同一个变量同时使用了构造方法注入和设值注入,那么构造方法将不能覆盖设值注入的值。很明显,因为构造方法只在对象被创建时被调用。
(3)在使用设值注入时还不能保证某种依赖是否已经被注入,也就是说,这时对象的依赖关系有可能是不完整的。而在另一种情况下,构造器注入则不允许生成依赖关系不完整的对象。
(4)在设值注入时如果对象A和对象B互相依赖,在创建对象A时Spring会抛出ObjectCurrentlyInCreationException异常,因为在对象B被创建之前对象A是不能被创建的,反之亦然。Spring用设值注入解决了循环依赖问题,因为对象的设值方法是在对象被创建之前被调用的。

18.Spring面向切面编程(AOP)

什么是AOP

OOP(Object-Oriented Programming)面向对象编程,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。

AOP(Aspect-Oriented Programming),一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理等。

Spring AOP and AspectJ AOP 有什么区别?AOP 有哪些实现方式?

AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。

(1)AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。

(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

19.Spring框架中都用到了哪些设计模式?

  1. 代理模式:在AOP和remoting中被用的比较多。

  2. 单例模式:在spring配置文件中定义的bean默认为单例模式。

  3. 模板方法模式:用来解决代码重复的问题。

  4. 前端控制器模式:Spring提供了DispatcherServlet来对请求进行分发。

  5. 依赖注入模式:贯穿于BeanFactory / ApplicationContext接口的核心理念。

  6. 工厂模式:BeanFactory用来创建对象的实例。

springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的

核心:控制反转和面向切面

请求处理流程:

  • 首先用户发送请求到前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;
  • 页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);
  • 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;
  • 前端控制器再次收回控制权,将响应返回给用户。

控制反转如何实现:

我们每次使用spring框架都要配置xml文件,这个xml配置了bean的id和class。
spring中默认的bean为单实例模式,通过bean的class引用反射机制可以创建这个实例。
因此,spring框架通过反射替我们创建好了实例并且替我们维护他们。
A需要引用B类,spring框架就会通过xml把B实例的引用传给了A的成员变量。

总结:

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,下方只是部分截图 想要资料的话也可以点击795983544领取 暗号CSDN。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/banzhuanhu/article/details/108562931