1. SpringMVC执行流程

SpringMVC的执行流程包括以下步骤:
用户发送请求到前端控制器
DispatcherServlet
。DispatcherServlet
调用HandlerMapping
找到具体处理器。HandlerMapping
返回处理器对象及拦截器(如果有)给DispatcherServlet
。DispatcherServlet
调用HandlerAdapter
。HandlerAdapter
适配并调用具体处理器(Controller)。Controller执行并返回
ModelAndView
对象。HandlerAdapter
将ModelAndView
返回给DispatcherServlet
。DispatcherServlet
传给ViewResolver
进行视图解析。ViewResolver
返回具体视图给DispatcherServlet
。DispatcherServlet
渲染视图并响应用户。
2. SpringMVC常用注解
SpringMVC的常见注解有:
@RequestMapping
:映射请求路径。@RequestBody
:接收HTTP请求的JSON数据。@RequestParam
:指定请求参数名称。@PathVariable
:从请求路径中获取参数。@ResponseBody
:将Controller方法返回的对象转化为JSON。@RequestHeader
:获取请求头数据。@PostMapping
、@GetMapping
等。@RestController
:@Controller
+@ResponseBody
3. SpringBoot常用注解
@SpringBootApplication
:由@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
组成。@SpringBootConfiguration注解

可以看到这个注解的被
@Configuration
标注,说明主入口
程序是一个配置类。也就是说主入口中的方法可以被@Bean
注解标注,被@Bean
注解的标注的方法会被Spring容器自动调用,并且将该方法的返回对象纳入IoC容器的管理。
SpringBoot主入口类实际上就是一个配置类
。这个
配置类
也可以称为源
,起源的意思,SpringBoot从这个配置类开始加载项目中所有的bean。
@EnableAutoConfiguration注解
该注解表示
启用自动配置
。Spring Boot 会根据你引入的依赖自动为你配置好一系列的 Bean,无需手动编写复杂的配置代码。
@ComponentScan注解
被
@SpringBootApplication
注解标注之后,会启动组件扫描功能,扫描的包是主入口程序所在包及子包
,因此如果一个bean要纳入IoC容器的管理则必须放到主入口程序所在包及子包下。放到主入口程序所在包之外的话,扫描不到。
@Value注解
@Value注解可以将application.properties
/application.yml
文件中的配置信息注入/绑定到java对象的属性上。
将配置绑定到bean上
被绑定的bean,需要使用@ConfigurationProperties(prefix = "app")
注解进行标注,prefix用来指定前缀,哪个是前缀,
也可以使用另外一个注解@Configuration
,用这个注解将Bean标注为配置类。
@Configuration
@ConfigurationProperties(prefix = "app")
4. SpringBoot自动配置原理
什么是自动配置
当添加了特定的 Starter POM 后,Spring Boot 会根据类路径上存在的 jar 包来自动配置 Bean(自动配置相关组件)(比如:SpringBoot发现类路径上存在mybatis相关的类,例如SqlSessionFactory.class,那么SpringBoot将自动配置mybatis相关的所有Bean。)。
如果开发者没有显式地提供任何与特定功能相关的配置,Spring Boot 将使用其默认配置来自动设置这些功能。当然,如果需要的话,用户也可以覆盖这些默认设置。
第一:程序从main方法进入执行,主入口类上使用
@SpringBootApplication
进行了标注。第二:
@SpringBootApplication
注解是复合注解,代表以下三个注解的功能:
@SpringBootConfiguration
:它被@Configuration
标注,说明主入口类就是一个配置类,此时该配置开始加载。@ComponentScan
:默认扫描的是主入口所在包以及子包。因此spring-boot-autoconfigure
包是扫描不到的,按说XxxAutoConfiguration
自动配置类是无法加载的!!!那么这些自动配置类又是如何加载和生效的呢?@EnableAutoConfiguration
:自动配置类的加载和生效全靠它了。该注解被翻译为:启用自动配置。
第三:@EnableAutoConfiguration
被@Import(AutoConfigurationImportSelector.class)
标注
@Import(AutoConfigurationImportSelector.class)
的作用是:将AutoConfigurationImportSelector
作为一个Bean加载到IoC容器中。导入组件AutoConfigurationImportSelector这个Bean的作用是:负责收集和选择所有符合条件的自动配置类。
第四:通过SpringFactoriesLoader读取文件
(1)META-INF/spring.factories 或者
(2)org.springframework.boot.autoconfigure.AutoConfiguration.imports(Springboot3读取该文件)
第五:条件注解进行过滤
configurations = removeDuplicates(configurations);
去重:移除 configurations 列表中的重复项,确保每个配置类只出现一次。
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
获取排除列表:从注解元数据和属性中获取需要排除的配置类名称集合。因为@EnableAutoConfiguration注解还能这么用:@EnableAutoConfiguration(exclude = {排除列表}, excludeName = {排除列表})
checkExcludedClasses(configurations, exclusions);
检查排除:验证 configurations 中是否有被排除的类,如果有,可能会抛出异常或记录警告。
configurations.removeAll(exclusions);
移除排除项:从 configurations 列表中移除所有在 exclusions 集合中的配置类。
configurations = getConfigurationClassFilter().filter(configurations);
过滤配置类:使用 ConfigurationClassFilter 对 configurations 进行进一步过滤。这一行通过条件注解进行判断,例如 @ConditionalOnClass、@ConditionalOnMissingBean 等。
fireAutoConfigurationImportEvents(configurations, exclusions);
触发事件:触发自动配置导入事件,通知其他组件或监听器关于最终确定的配置类和排除的类
第六:通过ImportSlector接口,将需要的bean加入到Spring容器中
第七:生成BeanDefinition
第八:实例化Bean对象,放入Spring的IOC容器中;
5. SpringBoot如何排除某些类的自动装配
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
6. Spring Boot项目中如何实现异步调用?
方式一:@EnableAsync + @Async + Future + ThreadPoolTaskExecutor
方式二:CompletableFuture + ThreadPoolTaskExecutor




