暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringMVC+SpringBoot篇

165
1. SpringMVC执行流程

SpringMVC的执行流程包括以下步骤:

  1. 用户发送请求到前端控制器DispatcherServlet

  2. DispatcherServlet
    调用HandlerMapping
    找到具体处理器。

  3. HandlerMapping
    返回处理器对象及拦截器(如果有)给DispatcherServlet

  4. DispatcherServlet
    调用HandlerAdapter

  5. HandlerAdapter
    适配并调用具体处理器(Controller)。

  6. Controller执行并返回ModelAndView
    对象。

  7. HandlerAdapter
    ModelAndView
    返回给DispatcherServlet

  8. DispatcherServlet
    传给ViewResolver
    进行视图解析。

  9. ViewResolver
    返回具体视图给DispatcherServlet

  10. 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自动配置原理
  • 什么是自动配置

  1. 当添加了特定的 Starter POM 后,Spring Boot 会根据类路径上存在的 jar 包来自动配置 Bean(自动配置相关组件)(比如:SpringBoot发现类路径上存在mybatis相关的类,例如SqlSessionFactory.class,那么SpringBoot将自动配置mybatis相关的所有Bean。)

如果开发者没有显式地提供任何与特定功能相关的配置,Spring Boot 将使用其默认配置来自动设置这些功能。当然,如果需要的话,用户也可以覆盖这些默认设置。

  1. 第一:程序从main方法进入执行,主入口类上使用@SpringBootApplication
    进行了标注。

  2. 第二:@SpringBootApplication
    注解是复合注解,代表以下三个注解的功能:

    1. @SpringBootConfiguration
      :它被@Configuration
      标注,说明主入口类就是一个配置类,此时该配置开始加载。

    2. @ComponentScan
      :默认扫描的是主入口所在包以及子包。因此spring-boot-autoconfigure
      包是扫描不到的,按说XxxAutoConfiguration
      自动配置类是无法加载的!!!那么这些自动配置类又是如何加载和生效的呢?

    3. @EnableAutoConfiguration
      :自动配置类的加载和生效全靠它了。该注解被翻译为:启用自动配置。

  1. 第三:@EnableAutoConfiguration
    @Import(AutoConfigurationImportSelector.class)
    标注

    1. @Import(AutoConfigurationImportSelector.class)
      的作用是:将AutoConfigurationImportSelector
      作为一个Bean加载到IoC容器中。导入组件AutoConfigurationImportSelector

    2. 这个Bean的作用是:负责收集和选择所有符合条件的自动配置类。

  1. 第四:通过SpringFactoriesLoader读取文件

  • (1)META-INF/spring.factories 或者

  • (2)org.springframework.boot.autoconfigure.AutoConfiguration.imports(Springboot3读取该文件)

  1. 第五:条件注解进行过滤

  • 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);

触发事件:触发自动配置导入事件,通知其他组件或监听器关于最终确定的配置类和排除的类

  1. 第六:通过ImportSlector接口,将需要的bean加入到Spring容器中

  1. 第七:生成BeanDefinition

  1. 第八:实例化Bean对象,放入Spring的IOC容器中;

5. SpringBoot如何排除某些类的自动装配

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

6. Spring Boot项目中如何实现异步调用?

方式一:@EnableAsync + @Async + Future + ThreadPoolTaskExecutor

方式二:CompletableFuture + ThreadPoolTaskExecutor


文章转载自戏说数据那点事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论