2019独角兽企业重金招聘Python工程师标准>>>

一、SpringBoot是什么?

微服务,应该是近年来最火的概念,越来越多的公司开始使用微服务架构,面试中被问到的微服务的概率很高,不管对技术的追求,还是为了进更好的公司,微服务都是我们开发人员的必须要学习的知识。

那么微服务究竟是什么呢?

我们通俗的理解方式就是:微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底 地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。

想要更好的了解微服务概念的同学可以去看看这篇论文:https://martinfowler.com/articles/microservices.html

dubbo和springcloud

目前比较成熟的微服务架构有两种:dubbo和springcloud,这两种技术各有优劣,他们最大的区别是:SpringCloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式

为何会选择springcloud,主要是从两个方面考虑:

  1. spring全家桶:作为Spring的拳头项目,springcloud能够与Spring Framework、Spring Boot、Spring Data、Spring Batch等其他Spring项目完美融合,而且springcloud有一整套的微服务架构解决方案,你可以很放心的使用,大家都爱全家桶。

  2. 社区支持与更新力度:DUBBO停止了5年左右的更新,虽然2017.7重启了,但是影响还是有一些的。

当然,这只是一种技术选择,不需要去争论。

讲了这么多,还没有说到主题,那springboot又是什么?SpringBoot专注于快速方便的开发单个个体微服务,SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖的关系,SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

要学习springcloud,就必须先学习springboot。

二、SpringBoot的优势

Spring Boot是来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用,多数Spring Boot应用需要很少的Spring配置。

用过spring开发就知道,spring配置繁多、开发效率低下、部署流程复杂、且第三方技术集成难度大。而使用springboot有如下优势:

1、快速创建独立运行的Spring项目以及与主流框架集成。

2、使用嵌入式的Servlet容器,应用无需打成WAR包 。

3、starters自动依赖与版本控制 。

4、大量的自动配置,简化开发,也可修改默认值。

5、 无需配置XML,无代码生成,开箱即用。

6、准生产环境的运行时应用监控。

7、与云计算的天然集成。

学习spring是有一定前提的,spring,maven都必须先掌握

三、hello world

相信大部分开发现在都是使用idea,关于idea的maven配置就不讲了,我们开始第一个springboot项目

新建项目:

下一步:

下一步:

下一步:

只勾选web,这里我们就构建成功了,再删除一些不必要的文件,最终结构:

新建一个controller:

代码:

@Controller
public class HelloController {@ResponseBody@RequestMapping("/hello")public String hello(){return "hello world";}
}

启动项目:

成功后,浏览器中输入:http://localhost:8080/hello

结果就出来了,简直太方便了,springboot不仅开发简单,部署也非常容易,直接打包

打包后的文件:

复制到桌面,然后直接执行命令 java -jar

刷新刚刚的地址,成功显示,就已经部署完成。

四、原理探究

我们先简单的探究下其中的原理,首先我们看pom包

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent>

进入依赖,发现他还有一个父依赖

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

在父依赖中我们可以看到里面对组件的版本号进行了写入:

我们默认是不需要写版本的,当然,没有在里面的依赖需要我们定义,这就是springboot的版本仲裁中心

再看另外的一个依赖:

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

这个依赖可以分为两个部分:spring-boot-starter说明这个是spring-boot场景启动器,而后面的web会帮我们导入了web模块正常运行所依赖的组件,如:

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

我们在看看主程序类

@SpringBootApplication //来标注一个主程序类,说明这是一个Spring Boot应用
public class SpringbootLearnApplication {public static void main(String[] args) {SpringApplication.run(SpringbootLearnApplication.class, args);}
}

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

@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: 翻译过来是配置类,上面标注这个注解说明这是一个配置类,相当于一个配置文件,配置类也是容器中的一个组件相当于@Component。

还有一个@EnableAutoConfiguration 这个注解说明开启自动配置功能。这就是为什么我们不需要写任何配置,就可以起项目的原因,以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效。

我们不妨再进入到这个注解中:

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

这里面@AutoConfigurationPackage ,翻译过来就是自动配置包,我们再到里面去看看,又有一个注解

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

这个注解我们就比较熟悉了,@Import 这个注解是给容器中导入一个组件;导入的组件由Registrar.class,这个 Registrar.class中的方法的就是将所在包及下面所有子包里面的所有组件扫描到Spring容器。

这个要注意必须是其子包,如果我们放在外面将不能被扫描,用个例子说明,假设我们在java路径下增加一个类,

@Controller
public class HelloWorld {@ResponseBody@RequestMapping("/world")public String world(){return "hello world";}
}

再次启动,是找不到这个地址的,因为这个包没有扫入其中,这样我们就明白了包是怎么扫描进去的。

下面我们再到@EnableAutoConfiguration 找到@Import({AutoConfigurationImportSelector.class}),

EnableAutoConfigurationImportSelector 翻译过来是导入哪些组件的选择器,这个类的作用是:将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。

public String[] selectImports(AnnotationMetadata annotationMetadata) {

这个方法会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件。

这样我们就知道自动配置类是如何导入的,有了自动配置类,免去了我们手动编写配置注入功能组件等的工作。

去看这个文件,发现里面有大量的注解配置类:

Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作,以前我们需要自己配置的东西,自动配置类都帮我们。

这样我们就对springboot的原理有个大致的了解,最重要的是springboot将我们之前要做的很多事情都做好了。

转载于:https://my.oschina.net/u/4094976/blog/3047995

SpringBoot之旅第一篇-初探相关推荐

  1. 程序员持续记录开始赚钱之旅 (第一篇)

    今日立贴开始记录,除却本质工作之外的赚钱门路.逐渐希望能实现财务自由.第一篇算是总结归纳吧 我实在是懒,就希望有那种睡着也能继续挣钱,或者别人在帮我挣钱的那种.接下来说的是自己做过的和将要做的. 总结 ...

  2. SpringBoot非官方教程 | 第一篇:构建第一个SpringBoot工程

    转载请标明出处:  http://blog.csdn.net/forezp/article/details/70341651  本文出自方志朋的博客 简介 spring boot 它的设计目的就是为例 ...

  3. spring el表达式解析_Spring之旅第一篇-初识Spring

    目录 一.概述 二.模块 三.动手创建 一.概述 只要用框架开发java,一定躲不过spring,Spring是一个轻量级的Java开源框架,存在的目的是用于构建轻量级的J2EE应用.Spring的核 ...

  4. 厦门之旅第一篇Gradle多渠道打包(动态设定App名称,应用图标,背景图片,状态栏颜色)

    我不是诗人,写不出厦门的美:我不是歌手,唱不出厦门的情:我不是画家,画不出厦门的景. 我只是一名程序员,我只能用我的眼,我的心去看去感受,那久违的海风吹拂着脸颊,好似内心那一份烦躁与沉重也随着海风飘向 ...

  5. 【实战HTML5与CSS3 第一篇】初探水深,美丽的导航,绚丽的图片爆炸!!

    目录 [实战HTML5与CSS3 第一篇]初探水深,美丽的导航,绚丽的图片爆炸!! [实战HTML5与CSS3 第二篇]绚丽的快速导航! [实战HTML5与CSS3 第三篇]我第一个HTML5网页诞生 ...

  6. springboot springcloud区别_SpringCloud微服务全家桶-第一篇!为什么要用微服务

    从今天开始,学习SpringCloud微服务全家桶. 一.引导 1.什么是微服务? 2.微服务之间是如何独立通讯的 3.springCloud和Dubbo有哪些区别? 4.什么是服务熔断?什么是服务降 ...

  7. 实战HTML5与CSS3 第一篇】初探水深,美丽的导航,绚丽的图片爆炸!!

    [实战HTML5与CSS3 第一篇]初探水深,美丽的导航,绚丽的图片爆炸!! [实战HTML5与CSS3 第二篇]绚丽的快速导航! [实战HTML5与CSS3 第三篇]我第一个HTML5网页诞生了(提 ...

  8. 架构师成长之旅_第一篇:插件与框架是什么?

    架构师成长之旅_第一篇:c++插件开发 目录 踏入工作前的准备 框架是什么? 多人开发 一.踏入工作前的准备 在即将踏入工作时,最主要的是你的代码量和你编码能力,最重要的是你的代码质量,在编码界代码质 ...

  9. 第一学期ACM之旅总结篇

    是我大一第一学期ACM之旅总结篇鸭,纪念逝去的青春: 自加入ACM集训队以来已有三个月之久,虽然一开始什么都不懂,但对ACM充满期待与向往.入队以后,通过和队员们一起学习以及各个学长的指导下,我慢慢地 ...

最新文章

  1. spring amqp rabbitmq fanout配置
  2. 第十章 基本数据结构——栈和队列
  3. cisco 恢复出厂设置
  4. ubuntu下打开matlab_ubuntu终端命令启动matlab方法
  5. 批量PDF转换成Office文件 PDF转换器下载
  6. 2021.02.04 Visual QA论文阅读
  7. rfcomm工具的使用方法 创建/dev/rfcomm0 并检测
  8. 地图库地之图地图窝_「方舆」秦朝地图及行政区划
  9. 用scikit-learn学习主成分分析(PCA)
  10. 以人为本、用“简”驭“繁”……统统都是新华三物联网的关键词儿!
  11. php 图片印章_php工具型代码之印章抠图
  12. 玉林中专计算机专业,玉林最好的中专学校有哪些 十大中专学校排名
  13. gc问题mysql连接池_数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决...
  14. bootstrap-内联文本元素-斜体
  15. 使用Hibernate SQLQuery(转)
  16. RiskCloud-基于Markov算法精准的FTA、 JSA、FMEA软件
  17. 银河麒麟服务器系统ip可ping通,但是tongweb的默认端口9060、8088不能访问,访问提示404
  18. 思量QQ本地会员v3.8官方2013版【免费使用部分QQ会员功能】
  19. 方舟手游服务器信息介绍,方舟生存进化手机版PVX服务器介绍 PVX服务器玩法
  20. Excel中过长数字的问题以及CSV文件避免这个问题的处理办法

热门文章

  1. 福布斯:2018年将改变世界的九股科技大趋势
  2. 30岁暂别职场、40岁提前退休:不上班的生活,开心吗?
  3. 揭秘:GitHub Star 5W人追更,这个框架是打工人石锤了!
  4. 【大数据】Zookeeper学习笔记
  5. 关于JS中switch语句的判断条件!
  6. GGGit与Github
  7. vue.js学习系列-第二篇
  8. 浅谈k8s cni 插件
  9. 明日微博软件的NABCD分析
  10. 使用Telnet与ssh协议远程登录linux系统