boot在计算机术语中是启动的意思,SpringBoot也就是Spring的启动器。
稍有经验的JavaWeb程序员对于传统SSM结构的MVC应用,大多数最不好的体验就是搭建一个项目需要进行大量的配置。稍有不慎就可能采坑。更关键的是有些配置基本就不会去进行定制化修改。为了解决这个问题,SpringBoot出世了。就如同我们所想的,SpringBoot给我们进行了大量的默认配置,从而达到了我们部署一个web项目,只需要下几个jar包然后直接运行即可。堪称JavaWeb程序员的新世纪福音。我尽可能的将文章分为实战篇和解析篇。实战文章里面只会涉及到整体的结构,不会过多的阐述细节。比如下面:
要搭建一个基本的后台应用,放在以前我们可能要考虑以下几个方面:
1、web应用的配置
2、maven的配置
3、Spring和SpringMVC的配置
4、日志配置
5、灵活构建
而实际上:
一、web应用的配置 (不用配置)
web应用的配置就是传统项目中web.xml文件的相关配置。我们可以在其中配置Servlet、Filter、Listener等等。在传统的SpringMVC应用中最常见的配置就是在ContextListenter中加载Spring、SpringMVC的配置文件。
不过在SpringBoot项目中,其为我们提供了默认的配置文件。所以我们不用再显示的编辑web.xml文件,省去了这一步骤。假如我们需要自定义Sevlet、Filter或者Listener等,只需要采用注解配置的方式进行配置即可,SpringBoot给我们提供了相关的RegisterBean。具体的配置细节我们目前可以不用了解,以后的实战中会用到。
二、maven的配置 (需要配置)
对于Java项目来说,最常见的包管理工具就是Maven了。Maven的基础配置主要有以下几点:
1、依赖包的坐标
2、编译或者打包的基本配置
3、编译或者打包时的资源过滤,这一步很重要,否则你在编译或者打包后启动项目时会提示你,xxxx配置文件not found等,很可能就是因为你没有配置好资源的过滤
具体配置后面会详细讲到
三、Spring和SpringMVC的配置(部分需要配置)
配置过传统SpringMVC的同学一定会记得spring-application.xml和spring-mvc.xml配置文件。spring-application.xml是spring相关的配置,如解析配置文件的PropertyConfigPlaceholder、开启包注解扫描的component-scan、数据库连接池、代理支持、bean的注册等。spring-mvc.xml则是spring-mvc项目的配置,基本配置项如支持注解的的驱动mvc:driver:annotation,以及如果不是前后端分离的项目还要配置视图解析器viewResolver。如果不是使用JavaConfig的形式启动项目,则需要在web.xml中显式的配置这两个文件的位置。
四、日志配置 (部分需要配置)
在传统的SpringMVC项目中如果想启用日志,我们需要在resources文件夹中创建一个log.properties文件进行相关的配置,然后在pom中添加我们想使用的日志类型的驱动的依赖。而在SpringBoot中,这一步也给我们省去了。默认给我们提供了Slf4j的日志驱动,甚至不用配置就可以启用日志。不过如果你有一些特殊的要求,还是要进行简单的配置。
五、灵活构建 (根据需要选择配置)
我们的环境一般分为分为开发环境、测试环境、线上环境。不同环境下的相关依赖是不同的,最典型的如数据库的配置。我们不可能所有环境都用同一个数据库。根据启动项或者是系统配置等等某个标志来决定系统运行时启用哪个环境的配置进行编译打包就叫做灵活构建。
传统项目中我们进行灵活构建通常直接采用Maven的profile或者是使用AntCall。不过在SpringBoot中我们获得了更好的体验。可以以配置文件名不同的方式直接应用不同的profiles,具体配置请看下面。
一、创建一个基本项目
上面介绍完了我们配置一个项目需要进行哪些配置下面我们来看一个实例。首先打开我们的编译器——IDEA,新建项目:

我们直接选用IDEA自带的SpringBoot项目创建选项然后一路Next就行。另外初始化的时候我们选择这几个导包选项,都是我们可能会用到的,最后完成创建,这样我们的一个SpringBoot项目就已经创建完成了,而且现在就可以直接运行了,相比较于传统的SpringMVC项目,是不是方便了100倍。

SpringBoot采用JavaConfig的形式来启动项目。让我们找到主包下的启动器类——Application,右键Run Application即可运行。

点开@SpringBootApplication我们可以看到这其实就是一些我们常见注解的几何体,只不过被继承成为了一个注解:

除了上面自定义注解所必须的四个元注解以外。我们依次来看下面的这几个注解:
1、@SpringBootConfiguration只是简单的继承了@Configuration注解,所以这两个注解没有本质上的区别,他们功能相同。@Configuration标志着其注解的类是JavaConfig类,可以用来配置Spring,作用和xml配置文件相同,并且可以互相引用。

2、@ComponentScan:我们如果配置过传统的Spring项目,对这个一定不会陌生。因为我们在使用Spring的时候经常会用到其提供的注解来帮助我们简化代码,提升效率。比如 @Controller、@Service、@Component等等。但是这些配置是Spring提供的,而不是Java自带的,所以为了给其赋予意义,我们必须让Spring去发现我们使用这些注解的地方,从而产生实际价值。@ComponentScan的作用和我们在xml问价中配置的component-scan标签的作用的一样的,默认扫描的包是该注解同级和同级下所有子包中的所有类。因为这也是为什么Application类的位置在主包下了。
3、@EnableAutoConfiguration则是SpirngBoot最重要的注解。我们之前说道SpringBoot只是Spring的一个快速启动器,其给我们带来的最大好处就是提供了默认配置,而这个注解的意思就是开启默认配置。也是体现了SpringBoot作用的最根本配注解。
我们打开resources目录,可以看到一个空的application.properties文件,这个就是SpringBoot项目的配置文件。不过SpringBoot还提供了yml文件的配置方式,相比较于properties文件,我更喜欢yml的配置方式,虽然他们的本质是一样的。所以我们将这个properties文件换成同名的yml文件:

二、配置MySql数据源和启用Mybatis支持
作为一个web项目,数据库可以说是我们所必须的。而在RDS(关系型数据库)中我们最常用的就是MySql了。如下图所示,我们就配置好了我么你的数据源。

可以看到yml配置文件中,我们能够清楚的看到配置之间的层级关系。举个例子,将图中的url转换为properties配置则是:
spring.datasource.url =xxxxxx
只要是datasource相关的配置,我们都要写上spring.datasource的前缀,个人觉得看起来十分混乱。
配置完数据库之后,我们总不能直接用传统的JPA进行操作吧,过于繁琐。所以我们还要继续配置Mybatis相关的配置。好消息是SpringBoot默认集成了Mybaits,所以我们只需要配置其扫描Alias别名的主包就行,这样Mybatis就会检测到com.zzz.base包以及其子包下的所有@Alias注解,以便于我们在mapper.xml中用到。

配置完之后我们来看下如何使用Mybatis。
要想使用Mybatis操作数据库,按照惯例我们需要编写mapper接口、mapper.xml文件、service接口以及其实现类。我们来写一个简单的例子:

假设这是一个我们的User类,我们为其设置了别名Alias(value = "User")

我们需要为其编写Mapper接口和xml文件,这里可能有个问题,SpringBoot项目中如何让Mybatis识别到Mapper接口呢?答案就是我们为其加上@Mapper注解就行了

下面来看一个基本的Mapper.xml的实现,还以User为例



UserMap中的返回值类型type="User" 这里的User就是我们在前面实体类上使用@Alias注解表明的别名。然后我们将Mapper接口注入到Service中就行了,并且为Service加上@Service注解将其注册成一个单例的Bean


至此,我们的Mybatis也配置完了。
三、maven相关配置
为了讲明为什么要配置maven,我还以上面的(二)为例子。

简单来看下User相关类的目录结构。能够发现Mapper接口和Mapper.xml文件是在同一目录下的。如果我们不显式的进行maven相关的配置,则一定会遇到的问题就是xml文件找不到。

即在编译后输出的target文件夹中找不到我们编写的xml文件,只能看到.java文件编译后的.class文件。
maven中给我们提供的<build></build>标签选项,可以让我们自己控制文件资源的过滤。

如上图所示,我们在build标签的字标签resources标签下,配置了两个resource标签。代表了两个应用于全局的资源过滤规则。<direction>指定为src/main/java标示该条规则作用于其本身和其所有的子包。<includes>标签标示哪些资源是我们需要的,如果使用maven提供的占位符机制,我们还可以同时配置<filter>,不过既然是Spring项目,我们最好还是使用Spring提供的PropertyPlaceholderConfig。<include>标签中使用了ant风格的路径,**/*.xml表示src/main/java包,以及其所有子包中的xml文件在编译打包时会原封不动的保留下来。同理可得下面的配置表示,resources文件夹下通常指默认保留.properties文件,通过显式指定,我们可以在resources文件夹下添加更多的配置供我们使用。
四、配置灵活构建
前面有说道,SpringBoot中的灵活构建十分好用。那他好用在什么地方呢?我们来一探究竟。

我们在配置文件中的spring级别下配置当前配置文件对应的profiles级别:



上面是我配置好的灵活构建的配置,其中application.yml配置文件可以看成是共享配置,application-dev.yml是开发环境配置,application-prd.yml是生产环境配置。他们是工作模式类似于不同配置项去并集,相同配置项覆盖。当我们在本地运行项目时,SpringBoot默认加载的是不带后缀名的application.yml配置文件,但是解析到其中指定了启用dev分支,则会在resources文件夹下寻找名为applicayion-dev.xml的配置文件进行解析。一定要注意的是,不仅名字后缀名要为dev,而且里面的配置profiles名也要和后缀名保持一致,这样才能给SpringBoot寻找到,毕竟约定先行与配置,既然给我们制定了规则,我们照做就行了。
比如:我在application.yml中配置了log的日志级别为INFO,在application-dev.yml中配置了日志级别为DEBUG,在application-prd中没有配置日志级别。
则当我们启用dev分支时,日志级别为DEBUG(没有配置取并集),当我们启用prd分支时,则实际上日志级别为INFO(相同配置覆盖)。
那么我们如何取显式的选择启用某个分支呢?最常见的方式就是在启动命令中加上命令行参数如:
java -jar xxx.jar --spring.profiles.active=prd
这样我们就在启动xxx.jar时指定了分支为prd,从而application-prd.yml配置文件会生效。
比如

这样我们就以启动了loan-spring-boot.jar包,并且应用的是prd分支。
五、日志相关
要想做好一个项目,日志管理是必不可少的。因为我们在排查错误时一定要用到日志。
不过SpringBoot默认给我们提供了按天切割的日志机制。每天会产生一个新文件,十分的好用。我们只需要配置日志的级别和生成的日志文件的位置就可以啦。


现在,一个SpringBoot的web项目就已经配置完成了。我们接下来只需要写Controller就行了。
下面是我自己做的一个不完全的后台模板。
https://github.com/GayITHub/back-templategithub.com