Spring微服务架构系列一:Spring-boot 介绍

Spring可以说是一个轻量级的容器框架,同时它也是最受java开发人员喜欢的框架,并俨然成为事实上的Ioc容器的工业标准。而Spring-boot是近几年来Spring最有影响力的框架,作为一个java开发猿类,有必要对Spring-boot有深入的了解。

01

Spring-boot介绍

Spring是一个非常庞大的框架,是为了解决企业级应用的复杂性而创建的。里面有非常多的产品像security、jpa、boot等等,其核心思想是IOC与AOP,这两个概念或者说思想是整个spring生态链的基石。Spring是一个分层的模块化架构,里面包含了很多组件,核心组件是Core、Context 和 Beans这三个组件,使用过Spring开发的同学对这三个模块应该挺眼熟,这里就不在啰嗦了。

那Spring-boot是什么呢?Spring-boot就是用来简化spring应用初始化搭建以及开发过程的框架集合,它简化了spring开发配置流程。但是有一点不变,他依赖的核心组件依然是Core、Context 和 Beans组件。在Spring-boot出来之前,我们构建一个Spring-web应用需要大量配置,而大量的xml配置和依赖管理一直是spring受人非议的地方,也是我以前使用中比较麻烦的地方。

02

Spring-boot简单用例

我们这里先从简单的构建项目入手,来看看Spring-boot使用上的直观感受。在不使用Spring-boot情况下,搭建一个Spring-mvc项目我们都需要哪些步骤?

以maven构建为例,步骤如下:

1.新建一个package方式为war的maven项目

2.加入各种依赖,比如:Spring-bean,Spring-context,Spring-webmvc 等。

3.修改web.xml加入spring listener;加入spring.xml配置,配置扫描包,事务等等。

4.配置tomcat或者其他web容器。

5.编译通过,启动项目。

做这些事情,对于一个java web开发人来说,可能要折腾半天。但是如果你使用Spring-boot,步骤就会简单很多:

1. 新建一个package方式为jar的maven项目

2. 加入Spring-boot启动依赖的jar包。

3. 现在你就可以写代码去启动你的项目了。

说到这里要申明的一点是,Spring-boot并不是区别以往Spring框架的全新框架,它只是一个Spring框架的承载者,或者说它是在Spring框架基础上,提升代码开发人员开发体验的工具集合。

03

Spring-boot类加载方式

当启动Spring-boot应用时候,我们只需要启动启动类中main方法即可。

简单来说,就是SpringApplication的run方法进行了各种Spring启动模块的初始化,并添加了各种监听等;有兴趣的小伙伴可以参考下这篇文章

https://zhaox.github.io/java/2016/03/22/spring-boot-start-flow。

我这里重点关注的是@SpringBootApplication这个注解,通过查看这个注解的源码:

就会发现,其实它是一个组合的注解,等价于@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解,这三个注解都的作用我们进行一下说明。

@SpringBootConfiguration其实就是@Configuration注解,就是一个配置类,类似以前xml配置形式,熟悉JavaConfig配置spring的人对这个注解应该并不陌生,这里就略过。

@ComponentScan是用来配置扫描路径及过滤条件,它把扫描到符合条件的bean加载到spring IoC容器中去;默认对启动类所在的package(包括子package)进行扫描。

如果你定义的类和启动类不在同一个package下,就不会被扫描到,当然也就不会被加载到IoC容器中去。Spring-boot提供了另外一种方式去加载不在同一路径下的配置bean,就是下面要讲到的这个注解。

@EnableAutoConfiguration注解@Import了EnableAutoConfigurationImportSelector这个类,而在EnableAutoConfigurationImportSelector(Spring-boot 1.5.x后的版本是AutoConfigurationImportSelector)这个类中调用了SpringFactoriesLoader.loadFactoryNames的方法,这个方法作用就是读取所有META-INF/spring.factories配置文件,并把里面key值是“org.springframework.boot.autoconfigure.EnableAutoConfiguration”的value返回。Spring-boot就是通过这些返回的值来初始化各种经常使用的bean对象,然后加入中Spring容器中去。

我们先看下Spring-boot引用的jar包,很容易找到一个叫Spring-boot-autoconfigure的jar包,这个包就是Spring-boot帮助使用者装备通用bean的配置模块,里面有我们常用的jdbc数据连接池配置、kafka的配置类、各种mq的配置类等等,下面我对这个模块进行简单的说明。

04

Spring-boot帮我做了什么

我们前面说过Spring-boot通过META-INF/spring.factories来帮助我们装配bean实例,接下来我们看一下Spring-boot-autoconfigure-x.x.x.RELEASE.jar包,详细来看一下这里面都做了哪些封装。我们把这个jar包展开如下:

看到这里有的人可能已经知道了些什么,首先先看下META-INF/spring.factories文件中定义的内容:

这些都是Spring-boot启动时候要进行检查的自动配置类。这些配置类帮我们集成各种常用开发模块,现在我们以其中集成redis数据库的模块类,并以RedisAutoConfiguration类为例来看看到底它都做了哪些工作。

这里先看下@ConditionalOnClass这个注解,他的作用是如果Spring扫描发现有JedisConnection.class, RedisOperations.class, Jedis.class 这几个类,那么Spring-boot就会自动帮我们去尝试初始化redis连接及操作相关bean加入到spring IoC上下文。例如RedisTemplate这个bean就会被自动创建加入到上下文中。

@ConditionalOnMissingBean这个注解用法就是当我们自己定义了RedisTemplate这个bean时候,Spring-boot就会使用我们提供的实例放入到 IoC容器中,并忽略在RedisAutoConfiguration中定义的Bean。

现在你也应该明白了为什么在Spring-boot使用中,我只要加入了数据库使用的jar包,加入数据库配置文件,就可以使用dataSource连接数据库了吧!

另外,我也要提醒一下,在使用Spring-boot进行开发时候,不需要的jar包不要随便加,可能会导致你项目启动报错。

05

如何集成自己的一个牛逼哄哄的开源项目

通过以上,我们知道了Spring-boot启动时候会扫描配置启动类所在目录,以及子package的所有java类;同时也会扫描工程本身加载jar包中的META-INF/spring.factories文件,对于文件中满足条件的配置类,Spring-boot会帮我们自动创建并加载到IOC容器中。利用这个特性,我们来演示下如何把(自己)的开源项目集成到Spring-boot中去。

但是这样会破坏这个开源项目的生态链,并且于你本身工程的耦合度太高。我们可以为这个开源项目书写独立autoConfig工程,在这个中配置你要注入到spring IoC容器中的bean。然后在生成的jar包中加入META-INF/spring.factories文件,并在文件中加入:

这样Spring-boot在启动时候就会去找指定的自动配置文件,加载到容器中去了。

End

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180104G0PI0600?refer=cp_1026

扫码关注云+社区