随着互联网技术的发展与不断创新,以及用户流量的不断增大,越来越多的企业项目面临大数据、高并发等问题,随之而来的就是通过分布式模型组建架构,微服务思想就集中体现了应用价值,2020 年的你还没有掌握微服务技术吗?

本课程会讲解 Spring Cloud 的重要知识点同时也会跟随源码,与框架设计者共同探索其设计奥妙所在,做到知其然更知其所以然!

实验介绍

Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发。

我们知道,Spring Cloud 整套微服务方案是基于 Spring Boot 作为架构制成的,那么 SpringBootApplication 启动类作为 Spring Boot 的项目起点,至关重要,本节就了解一下 SpringBootApplication。

知识点

  • 自定义 SpringApplication
  • 配置 Spring Boot 源
  • SpringApplication 类型推断
  • Spring Boot 事件

如何创建一个 Spring Boot 项目

1. Spring 官网创建

如图所示,在 官网 上快速搭建一个 Spring Boot 项目。

我们可以看到上面可以选择构建工具、语言、Spring Boot 版本、group 和 artifact 以及依赖。这里我们依据上图所示的选项进行创建项目,点击 Generate Project。

2. Maven 命令创建

同样地,我们也可以使用命令在终端上创建一个项目:

mvn archetype:generate -DgroupId=com.test -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

当我们将新创建后的项目结构展开就会得到:

在我们的环境中已经为大家准备好项目包,同学们执行以下命令便可以把项目下载到 WebIDE 中了。

wget https://labfile.oss.aliyuncs.com/courses/2502/demo.zip && unzip demo.zip

建议同学们直接使用我们的安装包解压项目,如果使用命令创建项目的话,在接下来会讲解的一些类就需要同学们手动创建了。

如果同学们不清楚详细的创建过程以及适配环境相关问题,可以先学习 Spring Boot 基础入门,因为 Spring Boot 是在 Spring 的基础上建立的。

SpringApplication 的详细讲解

实验之前,我们首先对新生成的 demo 项目对其做一个调整:将 .mvn 目录和 .gitignore 目录以及多余配置项删除(因为这些配置项目与本次实验无关),并对配置文件和 pom.xml 文件做一个修改:

  • 将 resources 资源目录下的 application.properties 文件修改为:
# 声明开放端口号
server.port = 8080
# 声明项目名称
spring.application.name = spring-application

最终的效果如图所示:

完成以上步骤配置,第一个 Spring Boot 项目的创建到这里就基本结束了,接下来我们分析一下 demo 项目中主函数代码,即在目录 com.example.demo 就可以查看到启动类 DemoApplication

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

这就是最简化版本的 Spring Boot 启动类,这里有两个地方值得我们注意:

一个是类 SpringApplication,另外一个是注解 @SpringBootApplication

Q: 什么是 SpringApplication
A: SpringApplication 是 Spring Boot 驱动 Spring 应用上下文的引导类。

Q:怎么理解注解 @SpringBootApplication
A:直接查看此注解的源码,源码如下:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {...
}

这里有三个注解值得我们注意:

  1. @ComponentScan 是用于定义扫描的路径,从中找出标识了需要装配的类自动装配到 Spring 的 Bean 容器中。
  2. @EnableAutoConfiguration 是激活自动装配,用于自动载入应用程序所需的所有 Bean。
  3. @SpringBootConfiguration 用于标注当前类是配置类,并会将当前类内声明的一个或多个以 @bean 注解标记的方法的实例纳入到 Spring 容器中,它与 @Configuration,在功能上是一致的。

Q: 如何理解 @Component 的“派生性”?
A:@Component 是用来把普通 POJO(Plain Ordinary Java Object) 实例化到 Spring 容器中,相当于配置文件中的 <bean id="" class=""/>,通常我们将 @Component 称之为元注解。所谓的派生性指的是以元注解为基准,其他注解再次调用元注解而产生的派生。

Spring 之注解编程模型

回顾一下 Spring Boot 中常见的注解,诸如 @Service@Repository@Controller@Configuration。Spring 在设计的时候,都是引入了 @component 作为这些注解的元注解。

@component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

  1. @Service:用于标注业务层组件。
@Component
public @interface Service {...
}
  1. @Repository:用于标注数据访问组件,即 DAO 组件。
@Component
public @interface Repository {...
}
  1. @Controller:用于标注控制层组件。
@Component
public @interface Controller {...
}
  1. @Configuration:允许通过调用同一类中的其他 @Bean 方法来定义 Bean 之间的依赖关系。
@Component
public @interface Configuration {...
}

Q:关于 Spring 之模式注解(Stereotype Annotations)?
A:所谓的模式注解:@component 逻辑上与 @Service@Repository@Controller@Configuration 都是一样,只是物理层面上不同,但都是为了找到 BeanDefinition。

现在我们来分析一下,@SpringBootApplication 这个注解,下面是通过源码显示的调用关系:

  • @SpringBootApplication:引入了 @SpringBootConfiguration 注解。
@SpringBootConfiguration
public @interface SpringBootApplication {...
}
  • @SpringBootConfiguration:又引入了 @Configuration 注解。
@Configuration
public @interface SpringBootConfiguration {...
}
  • @Configuration:最终引入了 @Component 注解。
@Component
public @interface Configuration {...
}

实际上注解 @SpringBootApplication 会标注当前一些功能。我们知道,注解不能像 Java 类一样继承,就通过以上的这样的方式层层调用。而注解的功能基本相似,我们就把注解的这种特性称之为派生性。

SpringApplication 启动类的基本写法

启动类 SpringApplication 就是 Spring Boot 应用的引导。

  1. 最简化的 SpringApplication(通过 Spring 官网通过脚手架下载的最简化的启动类):
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
  1. 通过 SpringApplication 增加参数的方式。现在我们在项目目录 com.test 创建 DemoApplication.java
package com.test;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;import java.util.LinkedHashMap;
import java.util.Map;@SpringBootApplication
public class DemoApplication{public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(DemoApplication.class);Map<String,Object> properties = new LinkedHashMap<>();properties.put("server.port",0);springApplication.setDefaultProperties(properties);ConfigurableApplicationContext context = springApplication.run(args);}
  1. SpringApplicationBuilder 方式。现在我们在项目目录 com.test 创建 SpringBootEventApplication.java
package com.test;import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;@SpringBootApplication
public class SpringBootEventApplication{public static void main(String[] args) {new SpringApplicationBuilder(SpringBootEventApplication.class) // Fluent API// 单元测试是 PORT = RANDOM.properties("server.port=0")  // 随机向 OS 要可用端口.run(args);}
  1. 非 Web 程序方式。现在我们在项目目录 com.test 创建 MicroservicesProjectApplication.java
package com.test;import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;import java.util.LinkedHashMap;
import java.util.Map;@SpringBootApplication
public class MicroservicesProjectApplication {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(DemoApplication.class);Map<String, Object> properties = new LinkedHashMap<>();properties.put("server.port", 0);springApplication.setDefaultProperties(properties);// 设置为非 web 应用springApplication.setWebApplicationType(WebApplicationType.NONE);ConfigurableApplicationContext context = springApplication.run(args);// 当前 Spring 应用上下文的类:org.springframework.context.annotation.AnnotationConfigApplicationContextSystem.out.println("当前 Spring 应用上下文的类:" + context.getClass().getName());

点击实验楼新课《Spring Cloud 从入门到实战》,快开始学习之旅!

微服务技术方案:Spring Cloud 从入门到实战相关推荐

  1. 微服务架构之Spring Cloud Eureka入门程序

    引言 首先作为Spring技术栈中的服务治理组件,它是基于Netflix的二次封装产品,主要完成的是微服务架构中的服务治理功能.SpringCloud通过Eureka增加了SpringBoot风格的自 ...

  2. 微服务为什么选Spring Cloud

    转载自   微服务为什么选Spring Cloud 现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性.同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术 ...

  3. 微服务架构与Spring Cloud Alibaba

    微服务架构与Spring Cloud Spring Cloud 微服务架构 1 微服务架构概述 2 Spring Cloud 微服务简介 3 Spring Cloud 技术栈 4 总结 Spring ...

  4. openfeign调用服务是否需要网关_阿里新一代微服务解决方案:Spring Cloud Alibaba

    1.Spring Cloud Alibaba 是什么 Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合. ...

  5. 微服务治理框架- - -Spring Cloud

     前言:最近微服务很是火热,那么什么是微服务?相信小伙伴们对此也是一知半解,那么今天叶秋学长带领大家一起学习微服务治理框架Spring Cloud,快来跟着学长一起学习吧~~ 目录 对SpringCl ...

  6. 微服务理念与Spring Cloud入门-----父工程与API子工程的创建教程

    前言 随着软件工程的规模的迅速扩大,对响应的速度的要求的越来越高,软件的开发过程面临越来越大的挑战.为了提高开发的效率,和质量,以及对成本的压缩,对软件的模块化,以及希望像硬件模块一样,能即插即用,成 ...

  7. 基于CSE的微服务架构实践-Spring Cloud技术栈选型

    [摘要] 本文介绍了CSE和Spring Cloud的关系,在技术选型上的差异.介绍了Spring Cloud用户使用Spring Cloud物理多租和进行CSE开发的两种策略. 当Spring Cl ...

  8. 微服务应用-基于Spring Cloud和Reactor构建网上商店微服务(下)

    前言 上篇主要是讲解理论知识和项目架构要点,这篇将集中在微服务中使用spring Boot.Spring Cloud和Project Reactor实现事件溯源的原始主题.文章中也会介绍项目实现一些技 ...

  9. 微服务架构集大成者—Spring Cloud (转载)

    软件是有生命的,你做出来的架构决定了这个软件它这一生是坎坷还是幸福. 本文不是讲解如何使用Spring Cloud的教程,而是探讨Spring Cloud是什么,以及它诞生的背景和意义. 1 背景 2 ...

最新文章

  1. iOS开发使用半透明模糊效果方法整理
  2. CSS基础学习 19.CSS hack
  3. NLP领域最近比较火的Prompt,能否借鉴到多模态领域?一文跟进最新进展
  4. 中国地区Win10免费升级活动正式结束
  5. $_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI']三者的区别
  6. 源码安装MySQL步骤
  7. 这样的高颜值网易云音乐,是你想要的吗?
  8. 白盒分析CC网络验证
  9. linux forge服务器,linux下搭建我的世界spongeforge 服务器 (海绵端)
  10. SPSSAU进行方差分析
  11. 大数据行业发展前景及岗位方向如何?
  12. 爱淘宝手机版分类导航菜单弹出效果设计
  13. 动态规划题目——背包
  14. spring cloud 微服务之间添加自定义的header头
  15. Thin LUN 和 Thick LUN
  16. Linux系统默认PATH环境变量的设置
  17. 如何使用(免费软件)Microsoft ICE轻松扫描大图片
  18. 工信部怒了,App 厂商们又作死
  19. 人工智能帮助警方监控社交媒体,会不会太过分了?
  20. 饮用水中的砷、硝酸盐含量超标,用什么方法可以解决

热门文章

  1. 英文名字大全(男篇)
  2. 获取计算机的信息(IP地址、MAC地址、CUP序列号、硬盘序列号、主板信息等等)...
  3. .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析
  4. ADO.Net 缓冲 插入大型数据
  5. Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)
  6. P4068 [SDOI2016]数字配对
  7. 使用VNC访问Linux桌面
  8. 在Eclipse中给JRE-Library添加本地Javadoc
  9. 浙江人22条经典经商法则(转载)
  10. 分享成功 用心经营就会结出果实(转)