Spring-Boot快速搭建web项目详细总结
最近在学习 Spring Boot 相关的技术,刚接触就有种相见恨晚的感觉,因为用 spring boot 进行项目的搭建是在太方便了,我们往往只需要很简单的几步,便可完成一个 spring MVC 项目的搭建,感觉就是下图:
好,下面就本人搭建项目的过程简单说说如何快速搭建一个 spring MVC 项目,相信我,spring-boot 这趟车,你上了根本就停不下来了!
下面是这篇博客的主要内容:
1、spring boot 介绍
2、spring boot 项目快速搭建
3、spring-boot 中单元测试
4、spring boot 与 mybatis 的集成
一、初识 spring boot
1、web 项目传统的搭建方式
导入 jar 包,配置 tomcat 的 context.xml 、web.xml,配置 class path ,启动。我靠,怎么一堆报错?classNotFoundException?尼玛哥不是导入了 jar 包吗,哦版本不对,那我使用 maven 管理 jar 包咯,千辛万苦终于配置好 maven 并学会了如何使用,启动也没报错了,但是尼玛已经过去打半天了我都还没有开始正式代码的书写,赶紧开始写业务代码吧,又发现 spring 中配置老是尼玛的报错,而我他妈只是想要搞个简单的发邮件功能啊。
所以说,自己搭建 web 项目,很多步骤都是重复性的,有没有什么工具可以一步达成啊?我只想快点投入到实际业务开发中去,我再也不想折腾 jar 包版本问题,再也不想折腾那繁琐的配置过程(虽然这是一个很好的学习过程),那么,spring boot 估计是老铁你不二的选择!
2、spring boot 是什么?
什么是 spring boot?直接 copy 官网的介绍:
原谅我并不咋地的英文,官网说,spring boot 可以让你以一种非常简单的方式构建一个机遇 Application 的 spring 项目,而你索要做的仅仅是 run 这个项目,spring boot 集成了主流的框架,我们构建项目大概只需要两三分钟,spring boot 项目,只需要很少的配置即可。
用了 spring boot 后,你会发现,什么配置问题,什么 jar 包问题统统没有了,你的生产效力会提高很多,因为,spring boot 已经帮你弄好了一个项目原型,你只需要在这个原型上添加自己的业务代码,自己的 service 和 dao 就万事大吉了!
spring boot 真的有那么厉害?好,下面就开始进入正题,说说怎么搭建利用 spring boot 搭建项目。
2、spring boot 项目快速搭建
1、快速搭建一个 spring MVC 项目
来开头来个 Hello World 先吧,下面紧跟我的步伐,利用 spring boot 快速搭建一个 MVC 项目
第一步,上官网,进行项目原始 jar 包的选取,官网在线搭建地址如下:https://start.spring.io/,看图:
特别说明下:在选择你要的 jar 包中,一般包括三部分:web 部分 -- 包含 了 spring、springboot 等常用的 web 开发必须 jar 包;spring 提供的工具类部分(devTool),这个用于热部署效果;数据库部分,spring boot 自动可以帮你继承各种数据库框架,我这里以 mybatis 为演示例子,最后选完 jar 包的效果如下:
第二步、下载项目并导入 IDE,当然,需要版本管理工具的支持,这里推荐 IntelliJ IDEA 开发工具(它简直就是 web 开发的标配!),具体看下面截图:
解压后得到项目文件,然后,就可以打开我们的 IDE,这里已我最爱的 IntelliJ idea 为例子
打开 idea,找到 file-->open--> 选择项目的路径,找打 pom 文件 --> 以 project 形式打开
第三步、hello spring 项目 大概长什么样子?打开项目之后,maven 会加载必须的 jar 包,这段时间,你可以去喝杯香醇的龙井茶或者咖啡,当项目构建完成之后,你会看到下面这样的典型 maven 目录结构:
具体各个目录放什么,请参考截图,这里补充说明的是,HelloSpringbootApplication 是整个项目的入口,我们启动项目不再是启动 tomcat,而是运行这个类,这个类的 main 方法就是整个项目的 main 方法即执行入口,
第四步,写 hello demo 了。新建一个 package demo,然后新建一个类 HelloSpringBoot,写入以下代码
@RestController public class HelloSpringBoot { @RequestMapping(path = {"/helloSpringBoot"}) public String HelloSpring (){ System.out.println("hello spring boot"); return "hello spring boot"; } }
我们先不解释这个类里面的东西,先配置并启动网站,初步感受下 spring boot 的魔力:
在启动网站前,由于 spring boot 是默认自动注册加载数据库相关的类文件的,所以为了不报错,我们需要打开数据库并在 resource 目录下的 application.property 中加入数据库配置相关文件,这里以 mysql 为例子,配置文件如下:
spring.datasource.url=jdbc:mysql://localhost:3306/wenda?useUnicode=true&characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=root
配置文件中各个字段含义估计读者也能看懂,后面会再具体说明。
当然,如果没有安装数据库,读者也可以在 HelloSpringbootApplication 类中利用 exclude 属性声明不自动注册加载数据库相关文件,具体参考下面的代码:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,MybatisAutoConfiguration.class})//这里的 MybatisAutoConfiguration.class 对应你的数据库框架 public class HelloSpringbootApplication {</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) { SpringApplication.run(HelloSpringbootApplication.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">, args); }
}
然后,我们所有的工作就完成了,可以启动网站了,见证奇迹的时候到了。
找到 HelloSpringbootApplication 类,双击打卡,右击鼠标,run,然后项目就启动了。
启动网站之后,输入 http://localhost:8080/helloSpringBoot 即可访问对应的方法。浏览器以及 idea 后台效果如图
这里简单解释下这个类里面的东西的含义:
首先是 @RestController 这个注解:用过 spring 的大佬估计知道是什么东西,当我们其他类要通过 spring 引用该类时,第一步就是要将该类注册到 spring 中,@RestController 就是相当于将这个类注册到 spring 容器的意思当然,还有一种比较常用的就是 @Controller,具体他们两区别后面再讨论吧。
然后就是 @RequestMapping,通过设置这个注解里面面的 path 属性,就可以声明相对于项目根路径(localhost:8080)的访问路径。
2、spring boot 项目中利用 springMVC 实现传参
上面的 demo 中的方法只是一个非常简单的实例,在实际生产中, 我们的应用不可能这么简单的,前端还需要传输参数到后台,所以,用 spring boot 构造的项目中,又如何实现传参呢?(感觉下面的都是在总结 sprign MVC 相关的内内容了,所以大神勿喷我脱离主题,因为感觉 spring boot 如果单独总结的话,貌似的确没什么好总结的,而且 spring boot 天生就不可能和其他 spring 组件分割)具体请参开下面代码例子:
@RestController public class HelloSpringBoot {/** * url 传参,访问的路径类似这样:localhost:8080/getParamDemo1/1 * 方法体中的参数要在前面加注释,@PathVariable,代表 url 中的参数 */ @RequestMapping(path = {"/getParamDemo1/{id}"}) public String getParamDemo1 (@PathVariable("id") int userId){ System.out.println("get param" + userId); return "success get param"; } /** * 当然,你也可以通过这种传参方式:localhost:8080/getParamDemo?param1=1 或者直接表单提交参数 * 当然,同时方法中参数声明的注释也要变成 @RequestParam,代表请求参数,required 属性说明了参数是否是必须的 */ @RequestMapping(path = {"/getParamDemo2"}) public String getParamDemo2 (@RequestParam(value="param1",required = false) int param){ System.out.println("get param" + param); return "success get param"; } }
3、构建 restful 编程风格
最近,resultful 风格编程挺火的(虽然个人觉得不可盲目跟风),而 spring boot 中利用其内置的 spring MVC 等框架,可以非常简单地实现这种编程风格。
例如说,我要请求查询一个数据,在 resultful 类的编程风格中,查询对应的是 get 请求,那么,spring boot(准确说是 spring MVC) 可以针对不同的请求进行处理,请看下面代码:
@RestController public class HelloSpringBoot {</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)"> * 通过设置RequestMapping的method属性便可以设置该方法可处理的对应请求了,例如下面的getRequestDemo方法只会处理get请求 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)"> @RequestMapping(path </span>= {"/getRequestDemo"},method =<span style="color: rgba(0, 0, 0, 1)"> RequestMethod.GET) </span><span style="color: rgba(0, 0, 255, 1)">public</span> String getRequestDemo (@RequestParam(value="param1",required = <span style="color: rgba(0, 0, 255, 1)">false</span>) <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> param){ System.out.println(</span>"get request test ,get param " +<span style="color: rgba(0, 0, 0, 1)"> param); </span><span style="color: rgba(0, 0, 255, 1)">return</span> "success get param"<span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)"> * 下面的deleteRequestDemo方法只会处理delete请求 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)"> @RequestMapping(path </span>= {"/deleteRequestDemo"},method =<span style="color: rgba(0, 0, 0, 1)"> RequestMethod.DELETE) </span><span style="color: rgba(0, 0, 255, 1)">public</span> String deleteRequestDemo (@RequestParam(value="param1",required = <span style="color: rgba(0, 0, 255, 1)">false</span>) <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> param){ System.out.println(</span>"delete request test ,get param " +<span style="color: rgba(0, 0, 0, 1)"> param); </span><span style="color: rgba(0, 0, 255, 1)">return</span> "success get param"<span style="color: rgba(0, 0, 0, 1)">; }
}
另外,利用上面说的 url 中的值(类似这个:path="/member/{userid}")进行资源定位,也非常符合 resultful 的风格要求,例如这 path="/getParamDemo1/{userid}" 的配置就是对应的就是对会员级别的某个用户(由 userid 定位)进行某些操作,如果要删除该用户,则对应 http 请求的 delete 请求即可。
通过上面的那些步骤,估计读者对于如何用 spring boot 进行一个简单的 web 项目快速搭建已经清楚了,下面在 spring boot 搭建的项目中如何进行单元测试。
三、spring boot 项目中的单元测试问题
spring boot 中集成了 junite 框架,对于单元测试,也不用写各种繁琐的类了,只需要对测试类进行一定的注释,spring boot 便会帮你做好一切,就算是数据库相关的操作,spring boot 也能很好地进行测试,具体还是看代码例子,下面是一个简单的测试业务类方法的例子:
首先,我们新建一个 service 层,新增一个 demo 类,最后的 demo 代码如下:
@Component public class ServiceDemo { public String testDemo(){ String rtnAfterDosomething = "我是返回结果"; //这里是业务代码 return rtnAfterDosomething; } }
下面的代码是测试类
@RunWith(SpringRunner.class) @SpringBootTest public class ServiceDemoTest { @Autowired ServiceDemo serviceDemo; @Test public void testDemo() { String rtn = serviceDemo.testDemo(); Assert.assertEquals(rtn, "我是返回结果");}}
如果要测试数据库 dao, 也是类似的,但是特别注意的是,测试之前必须启动项目(即 HelloSpringbootApplication 的 run 方法必须运行起来),否则将会包 can not find ApplicationContext 的错误。
四、spring boot 中配置数据库框架(以 mybatis 为例子)
在 spring boot 中集成数据库相关的开源框架也是很方便的(当然,记得在一开始新建项目的时候引用相关的 jar 包),当你上面的步骤都没什么错误的时候,你只需要简单地配置下 applocation.properties 文件即可
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=root #下面这条配置声明了 mybatis 的配置文件路径,classpath 对应的是和这个文件统计的 resources mybatis.config-location=classpath:mybatis-config.xml
目录的文件结构参考下面截图:
ok,mybatis 的引用配置便弄好了,下面我们尝试利用 mybatis 这个数据库框架,进行一个数据库的简单查询操作,首先,看下面的 mybatis-config.xml 的配置内容,读者可以以这个为模板进行配置,当然,想了解更具体的 mybatis 配置说明,建议去官网看看,这里不展开了:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">settings</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> Globally enables or disables any caches configured in any mapper under this configuration </span><span style="color: rgba(0, 128, 0, 1)">--></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">setting </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="cacheEnabled"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">/></span> <span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> Sets the number of seconds the driver will wait for a response from the database </span><span style="color: rgba(0, 128, 0, 1)">--></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">setting </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="defaultStatementTimeout"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="3000"</span><span style="color: rgba(0, 0, 255, 1)">/></span> <span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn </span><span style="color: rgba(0, 128, 0, 1)">--></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">setting </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="mapUnderscoreToCamelCase"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">/></span> <span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> Allows JDBC support for generated keys. A compatible driver is required. This setting forces generated keys to be used if set to true, as some drivers deny compatibility but still work </span><span style="color: rgba(0, 128, 0, 1)">--></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">setting </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="useGeneratedKeys"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">/></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">settings</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> Continue going here </span><span style="color: rgba(0, 128, 0, 1)">--></span>
</configuration>
恩,然后,就可以进行数据库的操作了,我简单用 mysql 建了个名字为 springboot 的数据库,在库里面建了一个简单的 demo 表(具体怎么建表那些不用我说了吧?实在没有接触过数据库的同学,可以自行百度或者谷歌去咯),然后,dao 代码如下:
@Mapper public interface DemoDao { @Select({"select demo_param from demo"})String queryDemo(); }
注意,mybatis 的 dao 是一个接口,关于 mybatis 更多的内容,请读者参开官方文档,这里不展开了。
然后,就在原来的 ServiceDemo 类中调用一下吧,代码看下图吧:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import springboot.hello.helloSpringboot.dao.DemoDao; @Component public class ServiceDemo { @Autowired DemoDao demoDao; public String testDemo(){ String rtnAfterDosomething = "我是返回结果"; //这里是业务代码 return rtnAfterDosomething; } public String queryDemo(){ return demoDao.queryDemo();} }
ok,简单写个测试类,出现小绿条,测试成功。
然后,所有项目原型的工作完成了,然后,我们就可以进行我们核心业务开发了,很快有没有?很爽有木有?所以说,spring boot 搭建项目的确飞快,可以让我们省去很多机械的前期操作,读者们赶紧去探索下吧,spring boot ,你值得捅有!
OK,今天总结到这里,这个项目的代码在 gitHub 上这个地址,需要的人自取:https://github.com/lcpandcode/helloSpringboot.git
最后说一遍,spring boot ,用得真他妈爽!赶紧来吧!