美文网首页
(二):Spring Boot入门

(二):Spring Boot入门

作者: 覆水无言 | 来源:发表于2019-02-26 17:14 被阅读0次

    Spring Boot入门

    1: 介绍

    spring boot是基于spring框架搭建起来的服务器应用框架,它嵌入Tomcat, Jetty或者Undertow等服务器,并且不需要传统的WAR文件进行部署。可以把它看成服务器总spring框架的一列整合,省去了我们很多配置等工作。可以帮助我们快速建立一个产品级别的企业级应用。

    1.1:原有的spring开发

    在原有的spring项目开发中,我们使用spring的组件建立工程后需要进行大量的项目配置,结合maven导入大量的jar包才能让我们的程序启动起来,大量的配置使程序员的工作配置大于开发,这给我们造成了很不好的体验,想要详细了解可以学习spring的开发,学习spring项目的开发并不会让我们重复造车,spring boot是基于spring的这样会使我们更好的理解spring boot。

    1.2:现有的spring开发

    从spring的全家桶时代,到现在的spring boot(JavaEE一站式解决方案)、spring cloud(分布式整体解决方案),给我们的开发提供了极大的便利,让我们精力都集中在开发上,避免了大量的配置。

    1.3:优点

    • 创建独立的spring应用程序
    • 嵌入Tomcat、Jetty、Undertow,无需部署WAR文件
    • 允许通过maven来根据需要获取starter
    • 尽可能的自动给配置spring,简化开发,也可修改默认配置。
    • 提供生产就绪型功能,如指标、健康检查和外部部署
    • 绝对没有代码生成,对xml没有配置要求。

    1.4:缺点

    spring boot最大的缺点就是入门容易精通难,在后台服务庞大的工程中,虽然spring boot为为我们带来的便利,但同样深层次的服务器问题也难暴露出来给我们处理,这样就造成了我们需要非常精通spring boot并且了解真个服务器的框架才能更好的完成我们的工作。

    1.5:大时代背景(微服务)

    微服务的概念在2014年被提出,微服务可以理解为一组小型服务的集合,每一个小型服务都运行在自己的进程内,服务与服务之间通过HTTP进行轻量级通信,每个服务都只专注与自己的设计目标,这样让开发更简介,微服务整体对外进行服务,访问通过网关来分析访问的是那个服务来进行分发。spring boot就是微服务的一站式解决方案。

    2:Spring Boot HelloWorld

    2.1: 创建工程

    熟悉maven的和IDE的可以直接在IDE中创建Spring Boot工程,还可以在start.spring.io网站上建立工程后导入IDE。本人用的idea.。
    导入后的文件目录

    2019-01-17 13-29-53屏幕截图.png
    • resources
      • startic:保存所有静态资源:js,css,jsp
      • templates:用来保存所有的模板页面,
    • application.properties:spring boot项目的配置文件。可以修改项目的默认配置。

    2.2:项目介绍

    spring boot为我们提供了很多starter,这些starter是一些模块的依赖集合,我们不再需要一个一个jar的手动导入,而只需要导入spring提供的starter就可以将整个我们需要的模块依赖导入进来,
    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>
        <parent>
            <!--导入spring boot的parent,使用spring boot都需要导入这个,它确定了
            你引入的spring boot模块的版本信息等,它为我们解决了依赖冲突等问题。-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.tian.learn</groupId>
        <artifactId>SpringBoot-Learn</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>SpringBoot-Learn</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <!--我们是一个web工程,导入spring boot的web依赖模块-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <!--导入spring boot的单元测试依赖模块-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <!--引入springboot的maven插件-->
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    程序的配置文件
    在resource目录下application.properties文件是这个项目的配置文件,在spring boot中绝大多数配置是spring为我们自动配置的默认配置,但我们也可以在这个文件中对默认配置进行修改,例如启动项目的端口号等。现在这个文件什么内容都没有
    程序的入口
    程序的入口就是Java源代码目录的 xxxApplication.java文件中,xxx一般为你的项目名,

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    /**
    *该注解标记了该类为spring boot的程序入口类,
    *一个spring boot项目该注解只能存在在一个类里
    */
    @SpringBootApplication
    public class SpringBootLearnApplication {
        /**
        * main函数入口,这里将拉起我们的spring boot项目,里面只有一套语句。
        */
        public static void main(String[] args) {
            SpringApplication.run(SpringBootLearnApplication.class, args);
        }
    
    }
    
    

    2.3:开发第一HelloWorld

    spring boot入门简单就在于它的开发简单,学习起来特别快,在Java源代码目录新建文件HelloWorld.java,创建helloWorld访问。

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    //注解标注这个类为RestControl,稍后会详细介绍
    @RestController
    public class HelloWorld {
        //注解标定访问的相对路径。
        @RequestMapping("/helloworld")
        public String hello(){
            return "hello world";
        }
    }
    
    

    2.4:运行

    spring boot中默认集成了Tomcat的内容,所以这里我们不再需要发布我们的项目到Tomcat,直接运行即可,也可以将它打包成jar包,使用Java命令执行。
    直接运行我们的程序入口main函数
    如果没有配置项目就是localhost:8080:我们的相对路径是helloworld,所以浏览器的全路径就是
    localhost:8080/helloworld, 查看结果。
    使用maven的package命令打包jar
    将项目打包成jar后,我们可以直接运行jar,命令:Java -jar 生成的包名

    3:项目详解

    @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}
    )}
    )
    public @interface SpringBootApplication {
    
    • 前四个注解都是Java的类注解,不了解的可以重新学习一下Java注解

    • SpringBootConfiguration : SpringBoot的配置类

      @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Configuration
      public @interface SpringBootConfiguration {
      }
      

      @configuration:原Spring注解,标记配置类,原spring开发有很多配置文件,现在springboot将配置文件都替换为配置类。它也是容器中的一个组件。

    • @EnableAutoConfiguration:开启自动配置功能
      以前我们spring开发配置许多参数,这个注解告诉springboot自动配置默认参数,有这个注解才能使自动配置生效。

      @AutoConfigurationPackage
      @Import({AutoConfigurationImportSelector.class})
      public @interface EnableAutoConfiguration {
      
      • @AutoConfigurationPackage:自动配置包:

        @Import({AutoConfigurationPackages.Registrar.class})
        public @interface AutoConfigurationPackage {
        }
        

        这个import注解是spring的底层注解,给容器导入一个组件Registrar,查看源码可以看到
        这个组件是将我们主配置类(@SpringBootAplication)所在包及所有子包下的所有组件都扫描到spring boot容器中。

      • @import({AutoConfigurationImportSelector.class}):
        给容器导入AutoConfigurationImportSelector组件,作用是将所有需要导入的组价以全类名的方式返回,这些组件会被添加到容器中,导入的组件为非常多的自动配置类(xxxAutoConfiguration),总结就是给容器中导入这个场景需要的组件,并配置好组件。
        有了这些自动配置类,免去了我们手动编写配置注入功能组件等工作
        主要函数为

        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
                        getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
        

        这个方法使用getSpringFactoriesLoaderFactoryClass-->EnableAutoConfiguration.class
        getBeanClassLoader为一个类加载器,其中从loadFacortyNames函数中可以看到加载器是从META-INF/spring.facroties(spring-boot-autoconfigure包下)文件中读取配置类的全类名,再通过类加载器来加载的。

    4:Spring Boot配置

    4.1 配置文件

    spring boot默认全局配置文件有两种。配置文件放在src/main/resources或 类路径/config下

    • application.properties
    • application.yml
      作用是修改spring boot自动配置配置的默认配置,Spring boot读取文件在底层为我们自动配置好
      yml为YAML文件,关于YAML 文件的语法可以百度搜,很简单,也可以看我的另一篇文章
    #配置启动的串口号
    server.port=8888
    

    4.2:YAML文件在spring boot中的使用

    参考另一篇文章YMAL

    相关文章

      网友评论

          本文标题:(二):Spring Boot入门

          本文链接:https://www.haomeiwen.com/subject/gbzbdqtx.html