Spring MVC
- 描述一下 Spring MVC 的执行流程
- 用户发送请求至前端控制器(
DispatcherServlet
):- 用户通过浏览器或其他客户端发送 HTTP 请求到 Spring MVC 的前端控制器
DispatcherServlet
。
- 用户通过浏览器或其他客户端发送 HTTP 请求到 Spring MVC 的前端控制器
DispatcherServlet
收到请求调用处理器映射器(HandlerMapping
):DispatcherServlet
接收到请求后,会调用HandlerMapping
来查找能够处理该请求的处理器(Handler
)。
- 处理器映射器找到具体的处理器(
Handler
):HandlerMapping
根据请求的 URL、HTTP 方法等信息,查找并返回一个处理器对象,该对象可以是一个具体的控制器方法或一个控制器类。
DispatcherServlet
调用处理器适配器(HandlerAdapter
):DispatcherServlet
根据HandlerMapping
返回的处理器对象,调用HandlerAdapter
来执行具体的处理器。
- 处理器适配器经过适配调用具体的处理器(
Controller
):HandlerAdapter
会根据处理器的类型(如注解方式的控制器方法或传统方式的控制器类),进行适配,并调用具体的处理器方法。
Controller
执行完成返回ModelAndView
:- 控制器方法处理完请求后,会返回一个
ModelAndView
对象,该对象包含了视图名和模型数据(即业务逻辑处理后的结果数据)。
- 控制器方法处理完请求后,会返回一个
HandlerAdapter
将Controller
执行结果ModelAndView
返回给DispatcherServlet
:HandlerAdapter
将控制器方法的执行结果(ModelAndView
)返回给DispatcherServlet
。
DispatcherServlet
将ModelAndView
传给视图解析器(ViewResolver
):DispatcherServlet
接收到ModelAndView
后,会调用ViewResolver
来解析视图名,找到对应的视图模板。
- 视图解析器解析后返回具体的视图(
View
):ViewResolver
根据视图名解析出具体的视图对象(如 JSP 页面、Thymeleaf 模板等)。
DispatcherServlet
根据视图进行渲染视图(即将模型数据填充至视图中):DispatcherServlet
根据解析后的视图对象,将模型数据填充到视图模板中,完成视图的渲染。
DispatcherServlet
响应用户:- 最后,
DispatcherServlet
将渲染后的视图响应给用户,用户在浏览器或其他客户端看到最终的页面或数据。
- 最后,
- 总结:
- Spring MVC 的执行流程是一个典型的 MVC 模式,将请求的处理分为控制器(
Controller
)、模型(Model
)和视图(View
)三个部分,通过DispatcherServlet
作为前端控制器来协调整个流程,实现了请求的处理和响应。
- Spring MVC 的执行流程是一个典型的 MVC 模式,将请求的处理分为控制器(
- 用户发送请求至前端控制器(
Spring Boot
-
对 Spring Boot 的理解
- Spring Boot 是一个用于简化 Spring 应用程序开发的框架。它通过提供一种快速启动的方式、自动配置和约定优于配置的原则,极大地简化了 Spring 应用的开发过程。
- 快速启动能力:
- Spring Boot 提供快速启动的能力,通过内嵌的服务器(如 Tomcat、Jetty 等),可以将应用程序打包成一个可执行的 JAR 文件,从而简化部署和运行。开发者无需手动配置服务器,只需编写少量的代码即可完成应用的开发。
- 自动配置机制:
- Spring Boot 采用基于条件注解(如
@Conditional
)和 SPI(Service Provider Interface)的自动配置机制。根据应用程序中引入的依赖和配置,Spring Boot 可以自动配置整个应用程序的环境。这大大减少了开发者需要进行的手动配置工作。 - 条件注解根据满足的条件加载对应的配置类或 Bean。这样,Spring Boot 可以智能地判断并加载所需的配置,无需开发者手动配置。自动配置模块包含大量的条件注解,根据条件注解的匹配规则,自动加载对应的配置类或 Bean,从而完成自动配置的过程。
- Spring Boot 采用基于条件注解(如
- 遵循 “约定优于配置” 的原则:
- Spring Boot 遵循 “约定优于配置” 的原则,它提供一系列默认的配置和约定。如果开发者按照这些约定进行开发,就可以大大减少配置文件的编写和配置项的设置。这样,开发者可以更专注于业务逻辑的实现,而不是配置文件的编写。
- 例如,Spring Boot 默认会根据类路径下的依赖自动配置相关的 Bean,如果开发者需要自定义配置,只需在
application.properties
或application.yml
文件中添加相应的配置项即可。
-
Spring Boot Starter 有什么用
- Spring Boot Starter 是一种预配置的模块,它封装了特定功能的依赖项,简化和加速项目的配置和依赖管理。
- 常用 Starter:
spring-boot-starter-web
:- 用于 Web 应用和配置,包括 Spring MVC、Tomcat 等。开发者只需引入相关的 Starter 依赖,无需手动配置大量的参数和依赖项。
spring-boot-starter-data-jpa
:- 用于数据库访问,包括 JPA、Hibernate 等。引入这个 Starter 后,会自动配置所需的组件和 Bean,无需开发者手动添加大量配置。
spring-boot-starter-security
:- 用于安全相关的功能,如用户认证、授权等。
spring-boot-starter-test
:- 用于测试相关的依赖,如 JUnit、Mockito 等。
- Starter 的作用:
- 简化配置:Starter 封装了特定功能的依赖项和配置,开发者只需引入相关的 Starter 依赖,无需手动配置大量的参数和依赖项。
- 管理依赖:Starter 还管理相关功能的依赖项,包括其他 Starter 和第三方库,确保它们能够良好地协同工作,避免版本冲突和依赖问题。
- 模块化开发:Spring Boot Starter 的设计使得应用可以通过引入不同的 Starter 来实现模块化的开发。每个 Starter 都关注一个特定的功能领域,如数据库访问、消息队列、Web 开发等。
- 创建自定义 Starter:开发者可以创建自定义的 Starter,以便在项目中共享和重用特定功能的配置和依赖。
-
Spring Boot 常用注解
@SpringBootApplication
:- 作用:标识主应用程序类,通常位于项目的顶级包中。这个注解包含了
@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。
- 作用:标识主应用程序类,通常位于项目的顶级包中。这个注解包含了
@Controller
:- 作用:标识类作为 Spring MVC 的 Controller。
@RestController
:- 作用:类似于
@Controller
,但它是专门用于 RESTful Web 服务的。它包含了@Controller
和@ResponseBody
。
- 作用:类似于
@RequestMapping
:- 作用:用于将 HTTP 请求映射到 Controller 的处理方法。可以用在类级别和方法级别。
@Autowired
:- 作用:用于自动注入 Spring 容器中的 Bean。可以用在构造方法、字段、Setter 方法上。
@Service
:- 作用:用于标识类作为服务层的 Bean。
@Repository
:- 作用:用于标识类作为数据访问层的 Bean,通常用于与数据库交互。
@Component
:- 作用:通用的组件注解,用于标识任何 Spring 托管的 Bean。
@Configuration
:- 作用:用于定义配置类,类中可能包含一些
@Bean
注解用于定义 Bean。
- 作用:用于定义配置类,类中可能包含一些
@EnableAutoConfiguration
:- 作用:用于启用 Spring Boot 的自动配置机制,根据项目的依赖和配置自动配置 Spring 应用程序。
@Value
:- 作用:用于从属性文件或配置中读取值,将值注入到成员变量中。
@Qualifier
:- 作用:与
@Autowired
一起使用,指定注入时使用的 Bean 名称。
- 作用:与
@ConfigurationProperties
:- 作用:用于将配置文件中的属性映射到 Java Bean。
@Profile
:- 作用:用于定义不同环境下的配置,可以标识在类或方法上。
@Async
:- 作用:用于将方法标记为异步执行。
-
Spring Boot 的启动流程
- 加载配置文件:
- Spring Boot 在启动时会加载
application.properties
或application.yml
配置文件中的配置项。
- Spring Boot 在启动时会加载
- 初始化 Spring 应用上下文:
- Spring Boot 会初始化 Spring 应用上下文(
ApplicationContext
),包括加载配置类、解析注解等。
- Spring Boot 会初始化 Spring 应用上下文(
- 自动配置:
- 根据项目的依赖和配置,Spring Boot 会自动配置相关的 Bean 和组件。
- 启动嵌入式服务器:
- 如果项目中包含 Web 相关的依赖(如
spring-boot-starter-web
),Spring Boot 会启动嵌入式服务器(如 Tomcat)。
- 如果项目中包含 Web 相关的依赖(如
- 启动应用:
- 最后,Spring Boot 会启动应用程序,监听指定的端口(默认为 8080),等待处理请求。
- 加载配置文件:
Java 新特性
- JDK 8 新特性
- Lambda 表达式:
- 允许以更简洁的语法编写匿名函数。Lambda 表达式使得代码更加简洁,并支持函数式编程风格。
- 示例代码:
Runnable runnableLambda = () -> System.out.println("Hello World!");
- Stream API:
- 提供了一种声明式的方式来对集合进行操作。它支持各种操作,如过滤、映射、排序、归约等。
- 示例代码:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> uppercaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());
- 函数式接口:
- Java 8 提供了一系列函数式接口,如
Consumer
、Predicate
、Function
等。 - 示例代码:
Consumer<String> printConsumer = System.out::println; printConsumer.accept("Hello World!");
- Java 8 提供了一系列函数式接口,如
- 新的日期和时间 API:
- 引入了
java.time
包,提供了更加全面和易用的日期和时间处理方式,解决了旧的Date
和Calendar
类的一些问题。 - 示例代码:
LocalDate currentDate = LocalDate.now(); int year = currentDate.getYear();
- 引入了
- 方法引用:
- 方法引用允许通过方法的名称来引用一个方法,而不是执行它。它们提供了一种更简洁的方式来传递方法作为参数。
- 示例代码:
Consumer<String> printConsumer = System.out::println; printConsumer.accept("Hello World!");
- 接口中的静态方法:
- 在接口中可以定义静态方法,使得接口能够包含一些通用的工具方法。
- 示例代码:
interface MyInterface {static void staticMethod() {System.out.println("Static method in interface");} }MyInterface.staticMethod();
- Lambda 表达式: