当前位置: 移动技术网 > IT编程>开发语言>Java > springboot之旅第一篇-springboot初探

springboot之旅第一篇-springboot初探

2019年03月27日  | 移动技术网IT编程  | 我要评论

一、springboot是什么?

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

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

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

想要更好的了解微服务概念的同学可以去看看这篇论文:

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有如下优势:

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

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

三、hello world

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

新建项目:

下一步:

下一步:

下一步:

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

新建一个controller:

代码:

@controller
public class hellocontroller {

    @responsebody
    @requestmapping("/hello")
    public string hello(){
        return "hello world";
    }
}

启动项目:

成功后,浏览器中输入:

结果就出来了,简直太方便了,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将我们之前要做的很多事情都做好了。

源码地址:

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网