Spring常用注解

注解 用法
@Configuration 标记配置类
@Component 标记为组件,组件将在IoC容器中实例化,可以指定实例的名字,在容器中默认单例模式
@Repository 标记数据访问层(DAO)组件,内部包含@Component
@Controller 标记控制器组件,内部包含@Component
@Bean 标记Bean组件,内部包含@Component
@Service 标记服务组件,内部包含@Component
@PostConstruct 标记一个方法,在构造函数执行后执行
@PreDestroy 标记一个方法,在类销毁前执行
@Autowired 用于依赖注入,有字段注入,构造器注入,set方法注入三种方式
@Test 测试方法
@ContextConfiguration(classes=xxx.class) 可以传入参数设置一个组件配置类
@SpringBootTest 标记一个测试程序
@RestContrller 标记一个Rest控制器,可以把返回对象打包成json返回
@ResponseBody 将请求方法返回的对象打包成json
@Primary 要依赖注入一个接口类时,该接口类可能有多个实现类实例在容器中(多个类实现了该接口),利用该注解可以提高这个实现类实例的优先级(未指定名称,优先取出)。
@Qualifier 自动注入一个接口类时,如果有多个实现类实例在IoC容器中,可以根据类名来指定要实例化的类
@SpringBootApplication Springboot应用
@Scope 指定组件作用域,可以修改默认实例化组件的单例(singleton)模式(程序启动时,IoC会创建组件实例,然后每次请求都返回同一个实例)变成原型(prototype)模式(每次从IoC容器中取组件实例,都会创建一个新实例返回)
@RequestMapping 给一个组件或者请求方法添加一个或多个请求路径,也能指定请求方法
@RequestParam 设置请求参数,可以设置参数名映射,是否必须,默认值
@PathVariable 设置路径参数,符合Restful api设计风格,可以设置参数名映射,是否必须
@Param 给方法参数起别名,在MyBatis等ORM框架中可以用于指定SQL语句中的参数名称。(唯一参数,且在<if>当中使用必须写,不写默认参数名arg0,也就是#{arg0})
@Mapper Mybatis用于标记数据访问层(DAO)组件的注解
@RunWith JUnit框架中的一个注解,它用于指定测试类的运行器(Runner),从而改变JUnit默认的测试运行器。
@Value 属性注入,以用于注入基本类型的值,字符串,集合,引用其他bean等等,也可以注入配置文件里面的变量参数

Spring核心思想名词解释

IoC

Inversion of Control:控制反转

控制反转是一种设计模式,它将程序中的控制权从调用代码转移到被调用的组件中,以实现松耦合和可重用的代码。传统的程序设计模式通常将控制流程交由调用代码实现,但这种方法会使得代码的可维护性和可扩展性变得更加困难,因为代码的实现与调用代码紧密耦合在一起。

控制反转的思想是将组件之间的依赖关系交由容器或框架管理,让它们根据需要动态地创建和管理对象,并在适当的时候将这些对象注入到需要它们的组件中。这样可以使得代码更加松耦合、可重用和易于测试,也使得代码的维护和扩展变得更加容易。

DI

Inversion of Control :控制反转

依赖注入(Dependency Injection,DI)是一种控制反转的实现方式。它是指将一个对象所依赖的其他对象(也称为它的依赖项)从该对象自身中分离出来,并通过构造函数、方法参数、属性等方式将这些依赖项注入到该对象中,以达到松耦合、可测试和可维护的目的。

在 Spring 中,我们可以通过在配置文件或注解中定义 Bean 来创建对象,然后使用 @Autowired 注解或 XML 中的 <property> 标签来实现依赖注入。Spring 会根据配置文件或注解中定义的信息,自动创建和管理对象之间的依赖关系,从而使得代码更加松耦合、可重用和可测试。

IoC Container

IoC 容器

在 Spring 中,IoC 和 IoC 容器不是完全相同的概念,但它们是紧密相关的,简单地说IoC容器是IoC的具体实现。

IoC 容器是 Spring 框架中的一个核心组件,它负责创建、管理和协调对象之间的依赖关系。Spring IoC 容器采用了依赖注入的方式来管理组件之间的依赖关系,它会根据配置文件或注解中定义的信息,自动创建和管理对象之间的依赖关系。Spring IoC 容器的实现有很多种,包括 XML 配置、Java 注解和 Java 代码等。本质上是一个工厂。

Spring MVC

Spring Model View Control

MVC

MVC 是一种设计模式,常用于开发 Web 应用程序和桌面应用程序。MVC 的全称是 Model-View-Controller,它将应用程序分成三个部分:

  1. 模型(Model):负责封装应用程序的业务逻辑和数据。
  2. 视图(View):负责渲染用户界面,呈现数据给用户。
  3. 控制器(Controller):负责处理用户输入并更新模型和视图。

MVC 模式通过将应用程序的业务逻辑、数据和用户界面分离,提高了应用程序的可维护性和可扩展性。在 MVC 模式中,模型和视图是完全独立的,控制器作为桥梁将它们连接起来。控制器负责处理用户输入,调用模型进行业务逻辑处理,然后将结果传递给视图进行显示。

image-20230225161703051

Spring MVC

Spring MVC 是一种基于 Java 技术的 Web 框架,用于开发 Web 应用程序。它是 Spring Framework 中的一个子框架,旨在提供一种灵活、强大、易于使用的 Web 框架。

Spring MVC 框架采用了模型-视图-控制器(MVC)架构模式,将 Web 应用程序的业务逻辑、数据模型和用户界面分离开来,使得应用程序更易于维护和扩展。在 Spring MVC 中,控制器负责处理用户请求并生成响应数据,模型用于封装应用程序的业务逻辑和数据,视图用于渲染用户界面并呈现响应数据。

在前后端分离的项目中,一般不会使用传统的 Spring MVC 框架。因为传统的 Spring MVC 框架是基于服务器端渲染的,而前后端分离的项目中,前端负责渲染用户界面,后端主要提供 API 接口,数据通过 API 进行交互。

服务端三层架构

在传统的服务端架构中,通常将应用程序分为三层:表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。表示层负责与用户进行交互,将用户请求转发到适当的控制器或处理程序;业务逻辑层负责处理业务逻辑,对用户请求进行处理并生成响应数据;数据访问层负责访问数据库或其他数据存储设备,将数据持久化到数据库中或从数据库中读取数据。

在这种架构中,Spring MVC 框架属于表示层(Presentation Layer)中的一部分,用于将用户请求转发到适当的控制器方法,并将处理结果返回给客户端。Spring MVC 提供了一系列的注解和工具,可以帮助我们轻松地构建 Web 应用程序,并支持多种视图技术(如 JSP、Thymeleaf、Freemarker 等)。

image-20230225162705528

执行流程

在处理 HTTP 请求时,Spring MVC 控制器会创建一个 Model 对象,并将处理结果封装到其中。Controller 会将 Model 对象传递给 DispatcherServlet,然后再由 DispatcherServlet 将 Model 对象传递给适当的 View 进行渲染。View 可以使用 Model 中的数据来生成 HTML、JSON 或其他格式的响应。

当用户发起 HTTP 请求时,Spring MVC 框架的执行流程如下图所示:

image-20230225164810451

  1. 当用户通过浏览器发起一个HTTP请求,请求直接到前端控制器DispatcherServlet;
  2. 前端控制器接收到请求以后调用处理器映射器HandlerMapping,处理器映射器根据请求的URL找到具体的Handler(Controller),并将它返回给前端控制器;
  3. 前端控制器调用处理器适配器HandlerAdapter去适配调用Handler(Controller);
  4. 处理器适配器会根据Handler去调用真正的处理器去处理请求,并且处理对应的业务逻辑;
  5. 当处理器处理完业务之后,会返回一个ModelAndView对象给处理器适配器,HandlerAdapter再将该对象返回给前端控制器;这里的Model是返回的数据对象,View是逻辑上的View。
  6. 前端控制器DispatcherServlet将返回的ModelAndView对象传给视图解析器ViewResolver进行解析,解析完成之后就会返回一个具体的视图View给前端控制器。(ViewResolver根据逻辑的View查找具体的View)
  7. 前端控制器DispatcherServlet将具体的视图进行渲染,渲染完成之后响应给用户(浏览器显示)。

参考连接

  1. 牛客网
  2. samarua的博客
  3. ChatGpt
  4. SpringMVC的执行流程以及运行原理