SpringBoot之旅第一篇-初探
一、SpringBoot是什么?
微服务,应该是近年来最火的概念,越来越多的公司开始使用微服务架构,面试中被问到的微服务的概率很高,不管对技术的追求,还是为了进更好的公司,微服务都是我们开发人员的必须要学习的知识。
那么微服务究竟是什么呢?
我们通俗的理解方式就是:微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底 地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。
想要更好的了解微服务概念的同学可以去看看这篇论文:https://martinfowler.com/articles/microservices.html
dubbo和springcloud
目前比较成熟的微服务架构有两种:dubbo和springcloud,这两种技术各有优劣,他们最大的区别是:SpringCloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式
为何会选择springcloud,主要是从两个方面考虑:
spring全家桶:作为Spring的拳头项目,springcloud能够与Spring Framework、Spring Boot、Spring Data、Spring Batch等其他Spring项目完美融合,而且springcloud有一整套的微服务架构解决方案,你可以很放心的使用,大家都爱全家桶。
社区支持与更新力度: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将我们之前要做的很多事情都做好了。
SpringBoot之旅第一篇-初探的更多相关文章
- SpringBoot之旅第二篇-配置
一.引言 虽然springboot帮我们进行了自动配置,但配置还是不可避免的,比如最简单的端口号,数据库连接.但springboot的配置一般不用xml进行配置,而是yml和properties,选择 ...
- 【spring-boot神器】第一篇:拦截器,过滤器,监听器,控制器,消息转换器,AOP执行顺序
整理一下这几天学习的资料和代码 第一部分.上代码 1.spring各种器的实现,idea搭建spring-boot的教程在这里http://www.jianshu.com/p/9082a533fa3c ...
- Mybatis之旅第一篇-初识Mybatis
一.JDBC的问题 为什么我们要使用Mybatis,是因为JDBC存在以下问题 1. 数据库连接创建.释放频繁造成系统资源浪费,从而影响系统性能.如果使用数据库连接池可解决此问题. 2. Sql语句在 ...
- (转) SpringBoot非官方教程 | 第一篇:构建第一个SpringBoot工程
简介 spring boot 它的设计目的就是为例简化开发,开启了各种自动装配,你不想写各种配置文件,引入相关的依赖就能迅速搭建起一个web工程.它采用的是建立生产就绪的应用程序观点,优先于配置的惯例 ...
- SpringBoot非官方教程 | 第一篇:构建第一个SpringBoot工程
转载请标明出处: https://www.fangzhipeng.com/springboot/2017/07/11/springboot1 本文出自方志朋的博客 简介 spring boot 它的设 ...
- SpringCloud之旅第一篇-微服务概念
一.单体架构的问题 微服务为什么会出现?在学习Springboot的时候知道Springboot极大的简化了我们的开发,我们可以快速的进行业务开发,Springboot单体应用在项目的开发初期能够满足 ...
- html5学习之旅第一篇
什么是 HTML5? HTML5 是下一代 HTML 标准. HTML , HTML 4.01的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍处于完善之中.然 ...
- Spring之旅第一篇-初识Spring
一.概述 只要用框架开发java,一定躲不过spring,Spring是一个轻量级的Java开源框架,存在的目的是用于构建轻量级的J2EE应用.Spring的核心是控制反转(IOC)和面向切面编程(A ...
- Linux之旅第一篇-目录结构及操作目录
一.引言 Linux对java开发来说也是一项必备的技能,因为项目基本都是部署在Linux操作系统的服务器中,虽然项目不一定需要我们去部署,但不管是自己测试环境部署,还是一些生产环境中日志的查看,Li ...
随机推荐
- XGBoost算法--学习笔记
学习背景 最近想要学习和实现一下XGBoost算法,原因是最近对项目有些想法,准备做个回归预测.作为当下比较火的回归预测算法,准备直接套用试试效果. 一.基础知识 (1)泰勒公式 泰勒公式是一个用函数 ...
- RocketMQ源码 — 九、 RocketMQ延时消息
上一节消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费.阿里云的ons还支 ...
- Python 基础【二】 下
str()的方法 字符串练习 1.str.capitalize str.capitalize #返回首字母大写,其他字母小写的字符串 >>> a = 'gwdsr' >> ...
- The more,the better。
贪婪是好的, 贪婪是对的, 贪婪是有用的, 贪婪是可以清理一切的, 贪婪是不断进化和进步的精华所在, 贪婪就是一切形式所在: 对于生活,对于爱情,对于知识我们一定要贪婪, 贪婪就是人们的动力. The ...
- 洛谷 P1613 解题报告
P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...
- 3d轮播图(另一种方式,可以实现的功能更为强大也更为灵活,简单一句话,比酷狗优酷的炫)
前不久我做了一个3d仿酷狗的轮播图,用的技术原理就是简单的jquery遍历+css样式读写. 这次呢,我们换一种思路(呵呵其实换汤不换药),看到上次那个轮播吗?你有没有发现用jquery的animat ...
- 关于ConcurrentSkipListMap的理解
一.前言 JCIP 提到了在 Java 6 中引入了两个新的并发集合类 ConcurrentSkipListMap 和 ConcurrentSkipListSet.其实只要介绍一下 Concurren ...
- Fedora Linux安装deb包
前言: 我们知道,在Linux系统上有两种主要的软件包格式,分别是RPM和deb. RPM是"RPM Package Manager(RPM软件包管理器)"的递归缩写.RPM是一种 ...
- Ubuntu 18.04 on Windows 10 更改 Oh-My-Zsh agnoster 主题下的目录背景色
题外话 我的 MacBook Pro 已经使用了6年多的时间,尽管作为一个 .NET 程序员绝大部分时间都是在 Windows 下工作,直到 .NET Core 的逐步成熟.要说 Mac OS,最满意 ...
- Securing Spring Cloud Microservices With OAuth2
From Zero to OAuth2 in Spring cloud Today I am presenting hours of research about a (apparently) sim ...