• 2. SPringBoot 解析HelloWorld 程序


     先看pom.xml中的代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <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.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>SpringBoot</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.9.RELEASE</version>
        </parent>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
    
    
    
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    View Code

    这个是pom.xml文件 ,其中:

    1.父项目

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.9.RELEASE</version>
        </parent>

    这个是SpringBoot 的 父项目,我们跟进去发现 ,它里面又依赖了一个父项目,在跟去发现里面配置了我们经常用得到的一些东西,所以这就是父项目,集成了很多东西

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.9.RELEASE</version>
            <relativePath>../../spring-boot-dependencies</relativePath>
        </parent>

    他来真正管理Spring Boot应用里面的所有依赖版本;

    2.启动器

    Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter 相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。

     <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>

    spring-boot-starter-web

    这样看: spring-boot-starter-web      spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;

    跟进去可以看到里面有很多我们WEB开发的必须依赖,比如tomcat ,springm、springmvc :

    <?xml version="1.0" encoding="UTF-8"?>
    <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.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starters</artifactId>
            <version>1.5.9.RELEASE</version>
        </parent>
        <artifactId>spring-boot-starter-web</artifactId>
        <name>Spring Boot Web Starter</name>
        <description>Starter for building web, including RESTful, applications using Spring
            MVC. Uses Tomcat as the default embedded container</description>
        <url>http://projects.spring.io/spring-boot/</url>
        <organization>
            <name>Pivotal Software, Inc.</name>
            <url>http://www.spring.io</url>
        </organization>
        <properties>
            <main.basedir>${basedir}/../..</main.basedir>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
            </dependency>
        </dependencies>
    </project>
    View Code

    在SpingBoot官网,有非常多的这些 启动器,你都可以导入,非常多 比如邮件、什么什么的,具体自己官网看即可。




    HelloWorldMain 主程序类

    package com.bihu;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class HelloWorldMain {
        public static void main(String[] args) {
            SpringApplication.run(HelloWorldMain.class,args);
        }
    }
    View Code

    主要是这个语句:

        SpringApplication.run(HelloWorldMain.class,args);

    其中 他那个 HelloWorldMain.class 必须是 @SpringBootApplication 标注的类,因为是主程序类,其中的args就是他的参数了。

    @SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用;

    @SpringBootApplication注解详解:

    跟进去发现他是个组合注解:

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(
        excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    ), @Filter(
        type = FilterType.CUSTOM,
        classes = {AutoConfigurationExcludeFilter.class}
    )}
    )
    View Code

    上面其实已经说过一点点了,这里详细讲解 它里面的每一个注解:

    1.@SpringBootConfiguration

    @SpringBootConfiguration : Spring Boot的配置类;
    
    跟入发现里面: @Configuration:配置类 上来 标注这个注解;【让SpringBoot 知道这是一个配置类】
    
        配置类 = 配置文件;配置类也是容器中的一个组件【@Component】;

    2.  @EnableAutoConfiguration

    @EnableAutoConfiguration:开启自动配置功能;
    以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自 动配置功能;这样自动配置才能生效;
    跟进去发现里面主要又是下面两个注解:
    @AutoConfigurationPackage
    @Import({EnableAutoConfigurationImportSelector.class})
    @AutoConfigurationPackage:自动配置包。

    @Import(AutoConfigurationPackages.Registrar.class): Spring的底层注解@Import【这个我们学过】,给容器中导入一个组件;
    导入的组件由 AutoConfigurationPackages.Registrar.class; 将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;
    这句话非常重要!我刚开始吃亏的时候就是分包了,因为他扫描加入组件到Spring容器, 只加入 配置类所在的包 以及 所在的包下面的组件!
    @Import(EnableAutoConfigurationImportSelector.class); 给容器中导入组件? EnableAutoConfigurationImportSelector:导入哪些组件的选择器;
    将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件, 并配置好这些组件;

    有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;
    SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);
    Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将 这些值作为自动配置类导入到容器中自动配置类就生效帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类都帮我们;
    发现:
    J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;【没事可以在里面看看 很多整合】

    至于控制器那是SpringMVC 的知识点了  这里不多说

    所以啊 挺方便的 都内部整好了!

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/15065876.html

  • 相关阅读:
    Linux下安装JDK
    Flink源码阅读(五)——Flink中任务相关的核心类简析
    使用CloudFlare Worker 来免费部署 JSProxy 服务
    Nginx:进程调度
    Javassist基本用法汇总
    IO
    IO
    springcloud3(五) spring cloud gateway动态路由的四类实现方式
    架构设计(二) 互联网网关平台对比
    Python 的协程
  • 原文地址:https://www.cnblogs.com/bi-hu/p/15065876.html
Copyright © 2020-2023  润新知