目录
- JavaWeb三大组件
- 依赖注入的方式
- @Autowire和@Resurce有什么区别?
- [Spring Boot的优点](#Spring Boot的优点)
- [Spring IoC是什么?](#Spring IoC是什么?)
- [说说Spring Aop的优点](#说说Spring Aop的优点)
- @Component和@Bean的区别
- 自定义注解时使用的RetentionPolicy枚举类有哪些值?
- 如何理解Spring的SPI机制?
- [Spring Boot自动装配原理](#Spring Boot自动装配原理)
- [Spring MVC工作原理](#Spring MVC工作原理)
JavaWeb三大组件
-
Servlet
:Servlet是JavaWeb应用程序中处理请求和生成响应的基本组件。它是一个Java类,通过实现或继承Servlet接口来处理客户端请求,并生成响应数据。 -
Listener
:监听器用于监听Web应用程序中的事件,并在事件发生时执行相应的逻辑处理。使用场景:
- 初始化
- 释放资源
- 日志记录
-
Filter
:过滤器用于在请求和响应的处理过程中对数据进行拦截和处理。一个请求可以经过多个过滤器的处理,每个过滤器可以在请求的处理前后进行操作和拦截。使用场景:
- 权限验证
- 请求转发
- 日志记录
- 字符编码
总结而言
- Servlet程序用于处理请求和生成响应数据
- Listener监听器用于监听特定的Web应用程序事件执行相应逻辑
- Filter过滤器用于对请求和响应数据进行拦截和处理。
它们各自在Web应用程序开发中具有重要的作用,能够实现灵活的请求处理、事件监听和数据过滤。
依赖注入的方式
在 Spring 中实现依赖注入的常见方式有以下 3 种:
- 属性注入(Field Injection)
- @Autowire实现属性注入
- @Resurce实现属性注入
- Setter 注入(Setter Injection)
- 构造方法注入(Constructor Injection)
@Autowire和@Resurce有什么区别?
-
autowire是Spring提供的;resource是J2EE提供的
-
resource默认使用name装配,当找不到name时,会按类型装配
-
AutoWire默认按类型装配,如果要使用名称装配可以用@Qualifier结合使用
Spring Boot的优点
-
开箱即用
通过在pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期
-
约定优于配置
约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需要的配置。
-
内置tomcat
Spring IoC是什么?
IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现,IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。
-
为什么叫控制反转?
控制 :指的是对象创建(实例化、管理)的权力
反转:控制权交给外部环境(Spring 框架、IoC 容器) -
Spring IoC的实现机制:工厂模式+反射机制
说说Spring Aop的优点
- 减少系统的重复代码
- 降低模块间的耦合度
- 封装切面逻辑
@Component和@Bean的区别
-
@Component 注解用在类上,表明一个类会作为组件类,并告知Spring要为这个类创建bean,每个类对应一个 Bean。
-
@Bean 注解用在方法上,表示这个方法会返回一个 Bean。
-
@Bean 注解更加灵活,相比@Component注解自定义性更强
自定义注解时使用的RetentionPolicy枚举类有哪些值?
值 | 源代码 | 类文件 | 虚拟机 |
---|---|---|---|
SOURCE |
✔️ | ||
CLASS |
✔️ | ✔️ | |
RUNTIME |
✔️ | ✔️ | ✔️ |
当值设为SOURCE
,只有源文件 中可以看到注解
当值设为CLASS
,可在源文件 和编译后的Class文件 中可以看到注解
当值设为RUNTIME
,不仅在源文件 和编译后的Class 文件中可以看到注解,JVM还能通过反射机制获取到注解
如何理解Spring的SPI机制?
- Java SPI
SPI 全称 Service Provider Interface ,是 Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。
SPI的作用就是为这些被扩展的API 寻找服务实现 。本质是通过基于接口的 编程+策略模式+配置文件 实现动态加载 。可以实现 解耦 (接口和实现分离),提高框架的 可拓展性(第三方可以自己实现,达到插拔式的效果)。
- Spring SPI
Spring SPI对 Java SPI 进行了封装增强。我们只需要在 META-INF/spring.factories
中配置接口/类/注解名,即可通过服务发现机制,在运行时进行自动加载。
Spring Boot自动装配原理
Spring Boot自动装配如下图所示:
Springboot项目的启动类需要由 @SpringBootApplication 注解修饰,该注解复合了如下三个注解。
-
@SpringBootConfiguration。表明Springboot启动类是一个配置类;
-
@ComponentScan。会将指定路径下的被特定注解修饰的类加载为Spring中的Bean,这些特定注解为@Component,@Controller,@Service,@Repository和@Configuration注解;
-
@EnableAutoConfiguration。用于开启Springboot的自动装配,该注解复合了如下两个核心注解。
- @AutoConfigurationPackage。用于将启动类所在的包里面的所有组件注册到spring容器。
- @Import(AutoConfigurationImportSelector.class)
-
自动装配流程说明(重要):
- @Import 将 AutoConfigurationImportSelector 注入到spring容器中
- AutoConfigurationImportSelector 通过 SpringFactoriesLoader 从类路径下去读取
META-INF/spring.factories
文件信息 - 此文件中有一个key为
org.springframework.boot.autoconfigure.EnableAutoConfiguration
,定义了一组需要自动配置的bean
Spring MVC工作原理
Spring MVC 原理如下图所示:
- 流程说明(重要):
- 客户端(浏览器)发送请求, DispatcherServlet拦截请求。
- DispatcherServlet 根据请求信息调用 HandlerMapping 。HandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。
- DispatcherServlet 调用 HandlerAdapter适配器执行 Handler 。
- Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给DispatcherServlet,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
- ViewResolver 会根据逻辑 View 查找实际的 View。
- DispaterServlet 把返回的 Model 传给 View(视图渲染)。
- 把 View 返回给请求者(浏览器)