开启Spring Boot 之旅

开启Spring Boot 之旅

1、Spring Boot 简介

简化Spring应用开发的一个框架;

整个Spring技术栈的一个大整合;

JavaEE开发的一站式解决方案。

2、微服务

Martion Fowler 的一篇长长的文章https://martinfowler.com/microservices/ ,2014;虽然他不是微服务提出者,但是他的这篇文章却明确定义说明了什么是微服务。

微服务:架构风格

一个应用应该是一组小型服务;可以通过HTTP的的方式进行沟通。

  • 单体应用(非微服务) ALL IN ONE

    所有的东西都写在一个应用里面。开发一个 OA CRM ERP 等系统,一个应用打包成war包放在tomcat等服务器上直接运行。开发测试简单,部署也简单。扩展也简单。负载不行的话,复制十几份相同的应用放在十几个服务器上,通过负载均衡机制来提高我们的并发能力。

    问题就是:牵一发而动全身 ;项目越大问题越多。

  • 微服务

每一个功能元素最终都是一个可独立替换和独立升级的软件单元;

详细参阅:中文文档 (martinfowler文章的翻译( ̄▽ ̄)~( ̄▽ ̄)~

  • 构建大型分布式应用

    服务微化带来的就是大型分布式的应用,面对如此大型的分布式应用我们该如何构建应用spring的官方网站一个经典的示意图给了我们思路,首先利用Spring Boot 快速构建应用。利用Spring Cloud进行分布式的网状互联互调。利用SpringCloud Date Flow 在分布式中间进行流式数据计算于批处理。

3、Spring Boot Quirk Start

  • https://start.spring.io/

    利用Spring Initializr.快速构建一个Spring Boot 项目。 或者使用Spring官方的集成开发环境 STS 、以及IntelliJ IDEA 等工具进行快速构建Spring Boot项目。

  • 通过Spring Initiallizr 会自动为我们生成如下的目录结构:

    |-demo

    ? |-src

    ? |-main

    ? |-java

    ? |-com.example.demo

    ? |-DemoApplication.java //启动类

    ? |-resources

    ? |-static //放置静态资源

    ? |-templates //前端模板

    ? |-application.properties //配置文件

    ? |-test

    ? |-java

    ? |-com.example.demo

    ? |-DemoApplicationTests.java //测试启动类

    ? |-target //程序打包后会在这里?

4 、Spring Boot 启动类

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @SpringBootApplication 来、标注一个主程序类,来说明这是一个Spring Boot 应用
 */
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        //Spring应用启动起来
        SpringApplication.run(DemoApplication.class, args);
    }
}

@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 {

@SpringBootConfiguration: Spring Boot 的配置类;

? 标注在摸个类上表示这是一个 Spring Boot 的配置类,他点开下面有个@Configuration注解

? @Configuration: 配置类上来标注这个注解;

? 配置类----对应-----配置文件;配置类也是容器中的一个组件 @Component

?

@EnableAutoConfiguration:开启自动配置功能

? 以前我们需要自己配置东西,而Spring Boot 帮我们自动配置;@EnableAutoConfiguration 添加在配置类上,自动配置才能生效。他点开,你面是一个@AutoConfigurationPackage与@Import的组合注解:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage:自动配置包的注解

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

? Spring的底层注解@Import,给容器中导入一个组件;导入的组件由AutoConfigurationPackages.==Registrar==.class 来指定。来看该类下的这个方法:

public void registerBeanDefinitions(AnnotationMetadata metadata,
                                    BeanDefinitionRegistry registry) {
    register(registry, new PackageImport(metadata).getPackageName());
}

我们debug一下:

从结果来看,@AutoConfigurationPackage注解就是将主配置类(@SpringBootApplication所标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器。

@Import({org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.class})

给容器导入组件的作用,导入什么样的组件?

AutoConfigurationImportSelector:导入哪些组件的选择器,进入该类我们来看一个方法:

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    }
    AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
        .loadMetadata(this.beanClassLoader);
    AnnotationAttributes attributes = getAttributes(annotationMetadata);
    List<String> configurations = getCandidateConfigurations(annotationMetadata,
                                                             attributes);
    configurations = removeDuplicates(configurations);
    Set<String> exclusions = getExclusions(annotationMetadata, attributes);
    checkExcludedClasses(configurations, exclusions);
    configurations.removeAll(exclusions);
    configurations = filter(configurations, autoConfigurationMetadata);
    fireAutoConfigurationImportEvents(configurations, exclusions);
    return StringUtils.toStringArray(configurations);
}

debug一下:

如图,结果加所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;

会给容器中导入非常多的自动配置类(xxxAutoConfiguration):给容器中导入这个场景所需要的所有组件,并配置好这些组件,免去了我们手写配置注入功能组件等的工作。

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

参数 EnableAutoConfiguration.class,classloader

Spring Boot 在启动的时候从类路径下的META-INF/spring.factories中获取到EnableAutoConfiguration指定的值;将这些值作为自动配置类导入到容器中,自动配置类就生效了。

而实际上Spring底层的配置一个都不能少,只不过这些自动配置帮我们做了。

JavaEE的整体整合解决方案和自动配置都在:spring-boot-autoconfigure-2.0.4.RELEASE.jar中

5、POM.xml文件

1、父项目
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

他是所用spring-boot-starter的父项目。而他打开后,他的父项目是:

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

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

即,Spring Boot 的版本仲裁中心:

so,我们在Spring Boot 中导入的依赖,默认是不需要写版本的,spring-boot-dependencies中为我们进行了依赖版本的管理。【而没有在spring-boot-dependencies中进行依赖版本声明的自然需要写版本了】。

2、导入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

spring-boot-starter-web:

spring-boot-starter: Spring Boot的场景启动器

spring-boot-starter-web:帮我们导入web模块正常运行所依赖的组件,当然以来的版本都受父项目仲裁。

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目中引入这些starter,相关场景的所有依赖都会导入进来。要用什么功能基因导入什么场景的启动器。详细参考,Spring Boot的帮助文档 页面搜索starter。来查看各种场景的启动器,以及他们所导入的各种依赖。

3、部署相关
<!--将应用打包成一个可执行的jar包-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
4、其他杂项
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>demo</name>
<description>Demo project for Spring Boot</description>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

包含包名、项目名、版本、打包类型、名称、描述、以及编码、JDK版本的配置信息。

6、启动spring boot 项目的三种方式

  1. ide中直接启动
  2. cmd 进入项目目录键入 mvn spring-boot:run来启动项目
  3. 通过学习我们知道,springboot内置了一个tomcat服务器,打包生成的jar包直接可以运行,我们通过mvn install命令来编译打包,在target目录下。进入该目录直接java -jar demo-0.0.1-SNAPSHOT.jar来启动springboot项目。

原文地址:https://www.cnblogs.com/nm666/p/9568982.html

时间: 2024-08-29 18:10:55

开启Spring Boot 之旅的相关文章

Spring Boot(spring mvc升级版)

周末挤出了一些时间,学了点东西,总结了一下,可能还有自己理解不到位的地方,希望大家一起交流学习,好东西要大家一起分享嘛~.时间有点紧张,所以样式没有来及做很好的调整,大家就凑活着看吧. Spring Boot特点: 化繁为简,简化配置: 备受关注,是下一代框架: 微服务的入门级微框架(SpringCloud). 这里我们采用的开发工具为IDEA 开发环境为1.8,maven版本为3.3.3 首先我们修改一下maven库地址,修改为阿里云的maven库(为了提高下载效率): <mirror> &

Spring Boot 探索系列 - 自动化配置篇

26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging,Log4J, Log4J2 an

给你一份Spring Boot核心知识清单①-1

预警:本文非常长,建议先mark后看,也许是最后一次写这么长的文章 由于51博客对文章字符数的限制,不得已分成两篇文章 说明:前面有4个小节关于Spring的基础知识,分别是:IOC容器.JavaConfig.事件监听.SpringFactoriesLoader详解,它们占据了本文的大部分内容,虽然它们之间可能没有太多的联系,但这些知识对于理解Spring Boot的核心原理至关重要,如果你对Spring框架烂熟于心,完全可以跳过这4个小节.正是因为这个系列的文章是由这些看似不相关的知识点组成,

给你一份Spring Boot核心知识清单①-2

由于博客字数限制,不允许发大于20w个字符的文章,所以需要分成两篇,接上文 五.出神入化:揭秘自动配置原理 典型的Spring Boot应用的启动类一般均位于 src/main/java根路径下,比如 MoonApplication类: @SpringBootApplication public class MoonApplication {     public static void main(String[] args) {         SpringApplication.run(Mo

spring boot认识

Spring Boot的好处: 1.配置简化 2.配合各种starter使用,基本上可以做到自动化配置 3.上手速度快 4.提供运行时的应用监控 运用IDEA创建spring boot项目请查看: http://blog.csdn.net/yxl8359026/article/details/51464041 spring boot的基础结构有三大块: 1.src/main/java:程序主入口Application,可以通过直接运行该类来启动spring boot项目 2.src/main/r

spring boot框架学习6-spring boot的web开发(2)

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用.spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定义消息转换器呢?怎么自定义spring mvc的配置呢?这些我们在公司都需要用的.这些怎么解决呢?在接下来的小节详细讲解这些.好了,现在开启spring boot的web开发第一节 本节主要: 1:InternalResourceViewResolver讲解 2:自动配置静态

spring boot框架学习7-spring boot的web开发(3)-自定义消息转换器

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用.spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定义消息转换器呢?怎么自定义spring mvc的配置呢?这些我们在公司都需要用的.这些怎么解决呢?在接下来的小节详细讲解这些.好了,现在开启spring boot的web开发第一节 本节主要: 1:自定义消息转换器 本文是<凯哥陪你学系列-框架学习之spring boot框架

Spring Boot 前后端开发系统 视频教程

第1章 Spring Boot 简介 1-1 Spring Boot 博客_课程导学 1-2 Spring Boot 是什么第2章 开启 Spring Boot 的第一个 Web 项目 2-1 -初始化第一个Web项目 2-2 -用Gradle编译项目 2-3 -探索项目第3章 一个Hello World项目 3-1 编写项目构建信息 3-2 自定义存储库,加速构建 3-3 编写程序代码及测试用例 3-4 配置Wrapper,运行程序第4章 开发环境的搭建 4.1-4.2 IDE及插件的安装配置

Spring Boot带前后端 渐进式开发企业级博客系统

第1章 Spring Boot 简介   1-1 Spring Boot 博客_课程导学   1-2 Spring Boot 是什么第2章 开启 Spring Boot 的第一个 Web 项目   2-1 -初始化第一个Web项目    2-2 -用Gradle编译项目   2-3 -探索项目第3章 一个Hello World项目   3-1 编写项目构建信息    3-2 自定义存储库,加速构建   3-3 编写程序代码及测试用例    3-4 配置Wrapper,运行程序第4章 开发环境的搭