Spring核心

Posted by Wh0ami-hy on March 11, 2023

1. Spring 到底是如何管理对象的

我们使用 Spring 的时候,大部分其实都是在使用 Spring 的核心容器功能。

Spring 的容器功能就是通过 BeanFactory 和对应的子类各种 xxxContext 去存储管理对象。

Spring 使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象

答:Spring使用IoC(Inversion of Control)容器来管理对象。IoC容器负责创建对象、装配对象、配置对象,并管理对象的整个生命周期。Spring的IoC容器是一个轻量级的容器,它不需要任何特殊的容器或服务器,只需要一个Java虚拟机即可。Spring的IoC容器可以管理任何Java对象,包括POJO(Plain Old Java Object)和JavaBean。

2. Spring 注入对象的方式和对应原理

当 Spring 成为对象容器后,它本身最重要的目的就是要去对系统中各种类进行对象注入。而工作中最常见的问题,就是 Spring 注入对象的各类问题。

也因此,广泛了解 Spring 注入对象的各类方式,从而能更加灵活地运用 Spring,深入理解注入对象的对应原理,从而能顺利无误地使用 Spring,就是我们深入学习 Spring 的重要目标。

答:Spring 注入对象的方式有三种:构造器注入、Setter注入和接口注入。构造器注入是通过构造器来注入对象,Setter注入是通过Setter方法来注入对象,接口注入是通过接口来注入对象。构造器注入的原理是在创建对象时,通过构造器参数来传递依赖对象;Setter注入的原理是在创建对象后,通过Setter方法来设置依赖对象;接口注入的原理是在创建对象时,通过接口方法来设置依赖对象。这些注入方式都是通过Spring容器来管理对象之间的依赖关系,从而实现松耦合的设计。

3. Spring 是如何管理对象之间的依赖关系的

除了使用完整对象的注入以外,工作中,我们还需要考虑对被注入对象属性的动态修改,可能还想要动态地注册新的 Bean 对象等等。

而要做到这些,我们就必须去了解 Spring 是如何管理对象之间的依赖关系的

答:Spring使用控制反转(IoC)和依赖注入(DI)来管理对象之间的依赖关系。在IoC中,对象不再负责管理它们所依赖的对象,而是将这个责任委托给Spring容器。Spring容器负责创建和管理对象,并将它们注入到需要它们的对象中。这种方式可以减少代码的耦合性,使代码更加灵活和可维护

4. AOP 的实现原理以及对其的内部使用

AOP 在 Spring 项目中被广泛用于权限、错误处理以及日志追踪等关键场景。

尤为重要的是,Spring 项目中的所有相关数据库事务,也都是通过 AOP 来管理和传播的。

答:AOP(面向切面编程)的实现原理是通过在程序运行期间动态地将代码切入到类的指定方法、指定位置上的编程思想。它的内部使用可以用于日志记录、性能统计、安全控制、事务处理、异常处理等方面

5. Spring 的扩展点有哪些以及如何做

很多时候,我们需要把公司的一些内部框架和系统嫁接到 Spring 中。为了减少开发成本,就要自定义一套完整的 Spring 扩展,比如:自定义注解、自定义配置类等。

想做到这些,就必须知道 Spring 有哪些扩展点,可以做什么扩展以及怎么做扩展。

  1. BeanPostProcessor:此接口允许您自定义Spring bean的初始化和销毁。您可以使用它在使用bean之前修改bean的属性或在销毁bean之后执行其他操作。
  2. BeanFactoryPostProcessor:此接口允许您在创建Spring bean之前修改Spring bean的配置。您可以使用它添加或删除bean定义的属性或修改bean的范围。
  3. ApplicationListener:此接口允许您监听Spring应用程序上下文中发生的事件。您可以使用它在发生某些事件时执行其他操作,例如创建bean或刷新应用程序上下文时。
  4. HandlerInterceptor:此接口允许您拦截和修改Spring MVC应用程序中的HTTP请求和响应。您可以使用它向响应添加其他标头或在处理请求参数之前修改请求参数。

要使用这些扩展点,您可以创建一个实现相应接口的类,并将其注册到Spring应用程序上下文中。

例如,要使用BeanPostProcessor接口,您可以创建一个实现该接口的类,并使用@Component注释进行注释。然后,您可以使用@Bean注释将该类注册到应用程序上下文中。

以下是在Spring应用程序中使用BeanPostProcessor接口的示例:

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 在初始化bean之前修改bean的属性
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 在bean初始化后执行其他操作
        return bean;
    }
}

要将此类注册到应用程序上下文中,您可以将以下代码添加到配置类中:

@Configuration
public class AppConfig {

    @Bean
    public MyBeanPostProcessor myBeanPostProcessor() {
        return new MyBeanPostProcessor();
    }
}

6. Spring MVC 的体系和重要类的作用

SpringBoot 的 Web 功能,其实就是在和 SpringBoot 背后内置的 Spring MVC 打交道。

Spring MVC使用了大量的Java注解来定义控制器、模型、视图和处理器等。它还提供了丰富的功能和扩展点,例如拦截器、数据绑定、表单验证、国际化、文件上传等。

Spring MVC的核心组件包括:

  1. DispatcherServlet:中央控制器,用于将请求分发给适当的处理器。
  2. HandlerMapping:用于将请求映射到适当的处理器(控制器)。
  3. Controller:业务逻辑处理器,处理请求并生成相应的响应。
  4. ViewResolver:用于查找视图(页面)并将其呈现给用户。
  5. Model:用于保存和传递数据。

7. Spring Boot 是如何自动配置好类的

Spring Boot 本身就是以 Spring 作为对象容器,以 Spring MVC 实现 Web 功能的一套缝合框架。学习了 Spring 和 Spring MVC 之后,我们就理解了 Spring Boot 绝大部分功能。

但是,Spring Boot 是如何把 Spring 中的各个组件缝合在一起的?其中重要的思想就是自动配置。

所以,学习了 Spring Boot 的自动配置,我们就能从头到尾完整的了解 Spring Boot 的整体体系结构和相关对象管理流程。

8. Spring MVC拦截器

拦截器实现了HandlerInterceptor接口。HandlerInterceptor接口定义了三个方法:

  1. preHandle:在请求到达Controller之前执行,返回值为boolean类型。如果返回true,则请求继续执行;如果返回false,则请求中断。

  2. postHandle:在Controller执行之后、视图渲染之前执行,可以对ModelAndView进行操作。

  3. afterCompletion:在视图渲染之后执行,主要用于资源清理等操作。

拦截器可以用于很多场景,例如:

  1. 权限验证:拦截请求,检查用户是否有访问该资源的权限。

  2. 日志记录:记录请求的信息和处理耗时等信息,方便后续分析和优化。

  3. 参数校验:拦截请求,对请求参数进行校验,避免不合法的参数进入Controller。

  4. 资源缓存:拦截请求,判断请求的资源是否需要缓存,如果需要则从缓存中获取。

9. Spring,Spring MVC,Spring Boot 之间什么关系

Spring 包含了多个功能模块,其中最重要的是 Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring 中的其他模块(比如 Spring MVC)的功能实现基本都需要依赖于该模块

Spring MVC 是 Spring 中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码

使用 Spring 进行开发各种配置过于麻烦比如开启某些 Spring 特性时,需要用 XML 或 Java 进行显式配置。于是,Spring Boot 诞生了!

Spring 旨在简化 J2EE 企业应用程序开发。Spring Boot 旨在简化 Spring 开发(减少配置文件,开箱即用!)

Spring Boot 只是简化了配置,如果你需要构建 MVC 架构的 Web 程序,你还是需要使用 Spring MVC 作为 MVC 框架,只是说 Spring Boot 帮你简化了 Spring MVC 的很多配置,真正做到开箱即用


本站总访问量