Spring Boot简介

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. Spring Boot来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用。

背景

J2EE笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。

解决

  1. “Spring全家桶”时代。
  2. Spring Boot —> J2EE一站式解决方案。
  3. Spring Cloud —> 分布式整体解决方案。

优点

  1. 快速创建独立运行的Spring项目以及与主流框架集成。
  2. 使用嵌入式的Servlet容器,应用无需打成WAR包。
  3. starters自动依赖于版本控制。
  4. 大量的自动配置,简化开发,也可修改默认值。
  5. 无需配置xml,无代码生成,开箱即用。
  6. 准生产环境的运行时应用监控。
  7. 与云计算的天然集成。

作用

  1. 简化Spring应用开发的一个框架。
  2. 整个Spring技术栈的一个大整合。
  3. J2EE开发的一站式解决方案。

微服务

  1. 2014年的martin fowler
  2. 微服务:架构风格(服务微化)
  3. 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;
  4. 单体应用:ALL IN ONE
  5. 微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元。
  6. 微服务文档

环境准备

  1. Spring Boot现在推荐jdk1.8以上,最好使用1.8或者11的版本。
  2. maven3.x:本地maven或者idea中的maven。
  3. Spring Boot:2.3.4(一般情况下都使用RELEASE版本)

Maven设置

给maven的setting.xml配置文件添加如下(指定镜像源和jdk):

  1. <!--镜像源nexus-->
  2. <mirror>
  3. <id>nexus-aliyun</id>
  4. <mirrorOf>central</mirrorOf>
  5. <name>Nexus aliyun</name>
  6. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  7. </mirror>
  8. <!--指定jdk-->
  9. <profile>
  10. <id>jdk18</id>
  11. <activation>
  12. <activeByDefault>true</activeByDefault>
  13. <jdk>1.8</jdk>
  14. </activation>
  15. <properties>
  16. <maven.compiler.source>1.8</maven.compiler.source>
  17. <maven.compiler.target>1.8</maven.compiler.target>
  18. <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  19. </properties>
  20. </profile>

idea整合maven

image-20201008153139549.png

image-20201008153159092.png

Spring Boot HelloWorld

一个功能:浏览器发送hello请求,服务器接收请求并处理,响应Hello World字符串。

  1. 创建一个maven工程;
  2. 导入Spring Boot相关的依赖。

    <parent>
     <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.3.4.RELEASE</version>
    </parent>
    <dependencies>
     <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
    </dependencies>
    
  3. 编写一个主程序;启动Spring Boot应用。

    /**
    * @author cai-xiansheng
    * @Description @SpringBootApplication用来标注一个主程序,说明这是一个Spring Boot应用
    * @create 2020-10-08 11:38
    */
    @SpringBootApplication
    public class HelloWorldMainApplication {
    
     public static void main(String[] args) {
    
         // Spring应用启动起来
         SpringApplication.run(HelloWorldMainApplication.class, args);
    
     }
    }
    
  4. 编写相关的Controller、Service ```java /**

    • @author cai-xiansheng
    • @Description
    • @create 2020-10-08 11:42 */ @Controller public class HelloController {

      @ResponseBody @RequestMapping(“/hello”) public String Hello() { return “Hello Spring Boot!”; }

}


8. 运行主程序测试:
   1. 执行有注解@SpringBootApplication的主程序即可运行
   1. 在Browser中访问localhost:8080/hello即可
9. 简化部署
```xml
<!--这个插件,可以将应用打包成一个可以执行的jar包-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  1. image-20201008154234169.png
  2. package即可打包成功,使用java -jar的命令执行即可,然后还能再Browser中访问即可
  3. image-20201008154523818.png

Hello World探究

1、POM文件

1、 父文件

<parent>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

<!--它的父项目是:spring-boot-dependencies。他来真正管理Spring Boot应用里面的所有依赖版本-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

spring-boot-dependencies也就是Spring Boot的版本仲裁中心;以后我们呢导入依赖默认是不需要写版本的;(没有在dependencis里面管理的依赖自然需要声明版本号,看下xml文件,发现里面只有spring相关的依赖版本,所以非Spring相关的,需要些完整)

2、启动器

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

spring-boot-starter-web:

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

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用的什么功能就导入什么场景的启动器。需要什么直接在https://mvnrepository.com/中查找即可

2、主程序类,主入口类

/**
 * @author cai-xiansheng
 * @Description @SpringBootApplication用来标注一个主程序,说明这是一个Spring Boot应用
 * @create 2020-10-08 11:38
 */
@SpringBootApplication
public class HelloWorldMainApplication {
    public static void main(String[] args) {
        // Spring应用启动起来
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}
  1. @SpringBootApplication:(Spring Boot程序)引用标注在某个类上说明这个类是Spring Boot的主配置类,Spring Boot就应该运行这个类的main方法来启动Spring Boot应用。
@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 {}
  1. @SpringBootConfiguration:Spring Boot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类。
    • @Configuration :配置类上来标注这个注解:配置类。。。配置文件,配置类也是一个容器中的一个组件;@Component
  2. @EnableAutoConfiguration:开启自动配置功能;以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉Spring Boot开启自动配置功能;这样自动配置才能生效。

    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {}
    
    • @AutoConfigurationPackage:自动配置包
      • @Import(AutoConfigurationPackages.Registrar.class):Spring的底层注解@Import ,给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class,将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;
    • @Import(AutoConfigurationImportSelector.class):给容器中导入组件:
      • EnableAutoConfigurationImportSelector:导入那些组件的选择器;将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中。会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入每个场景需要的所有组件,并配置好这些组件。
    • image-20201008170604417.png
    • 有了自动配置类,免去了我们手动编写配置注入功能组件等工作。
    • SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, classLoader);
  3. Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些纸作为自动装配类导入到容器中,自动装配类就生效,帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类都帮我们;J2EE的整合解决方案和自动配置都在Spring-boot-autoconfigure-1.5.9.RELEASE.jar;

Spring Initalizer快速创建Spring Boot项目

  1. IDE都支持使用Spring Initializer快速创建项目
  2. image-20201008171850301.pngimage-20201008171946957.png
  3. 选择我们需要的模块,向导会联网创建一个Spring Boot项目。
  4. image-20201008172043498.png
  5. 默认生成的的SpringBoot项目:
    1. image-20201008172231769.png
    2. 主程序已经生成好了,我们只需要我们自己的逻辑。
    3. resources文件中目录结构:
      • static:保存所有的静态资源文件:js,css,images;
      • templates:保存所有的模板页面(Spring Boot默认jar包使用嵌入式Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf);
      • application.properties:Spring Boot应用的配置文件,可以修改一些默认配置。
  6. 可以使用@RestController 代替@ResponseBody和@Controller