• Spring Boot底层原理



    📃个人主页: 不断前进的皮卡丘
    🌞博客描述: 梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
    🔥网站推荐:千里之行,始于足下。每天坚持刷题,巩固所学知识,也为将来找工作,面试做好准备----- 刷题神器

    Spring Boot优点

    • 简化maven依赖
    • 自动配置
    • 嵌入tomcat

    spring boot依赖的版本仲裁中心

    我们先创建一个项目
    在这里插入图片描述
    我们可以发现它有一个父模块spring-boot-starter-parent

     <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.7.2version>
            <relativePath/> 
        parent>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们可以按住CTRL,然后点击去看看
    在这里插入图片描述
    我们发现这个父模块,自己还有父模块spring-boot-dependencies

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-dependenciesartifactId>
        <version>2.7.2version>
      parent>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们继续点击进去看看
    在这里插入图片描述
    这里面定义了很多依赖的版本
    在这里插入图片描述
    在这里插入图片描述
    定义了spring boot项目中所有子模块依赖的版本号,称为spring boot的版本的仲裁中心。

    spring boot启动器(简化maven依赖)

    • 官方把很多模块功能,封装成了一个个的启动器
    • 命名方式:spring-boot-starter-模块名
    • 在这里插入图片描述

    我们点击spring-boot-starter-web,它里面的依赖如下代码所示

    • 添加了spring-web、spring-webmvc等springmvc的依赖
    • 添加了spring-boot-starter-tomcat依赖,嵌入了tomcat(精简版,不支持jsp,启动速度快)
      <dependencies>
        <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starterartifactId>
          <version>2.7.2version>
          <scope>compilescope>
        dependency>
        <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-jsonartifactId>
          <version>2.7.2version>
          <scope>compilescope>
        dependency>
        <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-tomcatartifactId>
          <version>2.7.2version>
          <scope>compilescope>
        dependency>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-webartifactId>
          <version>5.3.22version>
          <scope>compilescope>
        dependency>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-webmvcartifactId>
          <version>5.3.22version>
          <scope>compilescope>
        dependency>
      dependencies>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    主启动类和主配置类(xxxApplication)

    在这里插入图片描述
    按住ctrl,点击这个注解进去看看

    • @SpringBootApplication
      标注了@SpringBootApplication注解的是程序主入口类和主配置类,它是一个组合注解,包含以下几个主要的注解
      在这里插入图片描述

      • @SpringBootConfiguration
        它的内部使用了原生注解@Configuration 说明当前类是项目的配置类
        在这里插入图片描述

      • @EnableAutoConfiguration 开启自动配置
        在这里插入图片描述

      • @ComponentScan 组件扫描,默认会扫描主配置类所在包下的所有注解
        在这里插入图片描述

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE})
    @Documented
    @Repeatable(ComponentScans.class)
    public @interface ComponentScan {
        @AliasFor("basePackages")
        String[] value() default {};
    
        @AliasFor("value")
        String[] basePackages() default {};
    
        Class[] basePackageClasses() default {};
    
        Class nameGenerator() default BeanNameGenerator.class;
    
        Class scopeResolver() default AnnotationScopeMetadataResolver.class;
    
        ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
    
        String resourcePattern() default "**/*.class";
    
        boolean useDefaultFilters() default true;
    
        ComponentScan.Filter[] includeFilters() default {};
    
        ComponentScan.Filter[] excludeFilters() default {};
    
        boolean lazyInit() default false;
    
        @Retention(RetentionPolicy.RUNTIME)
        @Target({})
        public @interface Filter {
            FilterType type() default FilterType.ANNOTATION;
    
            @AliasFor("classes")
            Class[] value() default {};
    
            @AliasFor("value")
            Class[] classes() default {};
    
            String[] pattern() default {};
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    测试类

    在这里插入图片描述
    我们可以看到用单元测试,也是可以的,那么什么情况单元测试不好用呢
    在这里插入图片描述
    我们创建一个实体类stu
    在这里插入图片描述
    然后测试一下,我们发现stu并没有注入进来
    在这里插入图片描述
    因为这个时候,我们在单元测试中,并没有把springboot的一些配置整合进来,我们加上@SpringBootTest
    在这里插入图片描述

    使用maven构建spring boot项目

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    pom.xml

    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
    
        <groupId>com.zyh.springbootgroupId>
        <artifactId>springboot04_mavenartifactId>
        <version>1.0-SNAPSHOTversion>
    
        
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.7.2version>
        parent>
        <properties>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
        properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
            dependency>
        dependencies>
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    添加主程序
    先创建一个包,然后把主程序写在这个包下面

    在这里插入图片描述

    在配置文件中可以指定端口号等信息
    在这里插入图片描述
    编写Controller
    在这里插入图片描述
    测试,运行启动类
    在这里插入图片描述

  • 相关阅读:
    Zookeeper集群安装部署、Kafka集群安装部署
    (十五)mmdetection源码解读:runner
    三个修饰符:abstract、static、final(JAVA基础五)
    89.(前端)商品分类显示优化——关闭选择框、下拉框、修改间隔、显示层级为tag标签、添加操作栏、添加索引
    数据结构———— 堆
    【21天学习经典算法】折半查找与折半插入排序(附Python完整代码)
    行业追踪,2023-10-18
    Java进阶导图xmind版本
    什么是 DNS 隧道以及如何检测和防止攻击
    Vue项目实战之人力资源平台系统(十)图片上传和打印员工信息
  • 原文地址:https://blog.csdn.net/qq_52797170/article/details/126052844