关于Spring Boot的学习心得。安装,集成Spring Boot 与 mybatis
前两天刚上班,然后就被我们的直属老大叫去分组搞定一些技术,出品成文档在所有人之间传阅学习。于是我和其余俩个小伙同心协力之下搞出了一份成品。其他两个小伙伴很给力。没有他们,无法有这份文档。虽然有些粗略,但还是希望能给大家有所帮助。
Spring Boot学习文档
文档说明:标有浅灰色背景内容为扩展内容,忽略阅读不影响学习Spring Boot的使用。
一. 为什么选择Spring Boot
随着动态语言的流行(Ruby、Groovy、Scala、Node.js),java的开发显得格外的笨重,
繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
在上述环境下,Spring Boot应运而生。它使用“习惯优于配置”(项目中存在大量的配
置,此外还内置一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。
1.spring boot的优缺点
(1)优点:
1、快速构建项目。
2、对主流开发框架的无配置集成。
3、项目可独立运行,无须外部依赖Servlet容器。
4、提供运行时的应用监控。
5、极大的提高了开发、部署效率。
6、与云计算的天然集成。
(2)缺点:
1、如果你不认同spring框架,也许这就是缺点。
二.idea快速搭建spring boot项目+原理解析
1. 创建简单web项目(没有连接数据库)
第一步:点击File—>New—>Project… 弹出以下页面
第二步:点击上图所示的“1”即Spring Initializr即可创建spring boot应用,“2”和“3”保持默认即可,点击Next进入下一步。
注意:IntelliJ IDEA的商业版本是自带这个选项功能的,但是社区版本是没有这个选项的,需要另外安装插件“Spring Assistant”。关于商业版IntelliJ IDEA的**方法在文档末尾会有说明。
第三步:Next之后进入页面,这些便是传统创建maven工程的选项了,相信大家不会陌生。
注释:首先,SpringBoot
应用是可以打包成JAR
或者WAR
形式的。但是官方文档推荐的是打包成JAR
,作为一个web
应用
,为什么会推荐打包成JAR
,这是因为SpringBoot
内集成了Tomcat
服务器,当你启动SpringBoot
应用的时候,内置的Tomcat
服务器就会启动,加载web
应用
。这个可以从启动SpringBoot
项目的时候从控制台的日志中可以看出,如下:
第四步:上图填完点击Next,变到了比较重要的一个页面
首先,我们创建一个简单的可以通过浏览器输入http://localhost:8080/访问的简单web应用,所以我们依次点击最左边的“Web”,再勾选中间的“Web”,接着点击Next。这个页面在接下来需要创建连接数据库的web应用时还会讲到。
第五步:默认项目名称,还有根据需要选择项目存放路径,点击“Finish”便可以创建一个Spring boot应用了。
成功创建后目录结构如下:
第七步:运行,点击src下的main目录里的SpringBootDemoApplication文件或者test下的SpringBootDemoApplicationTests文件都可以运行测试。
运行后显示以下类似图案并且无报错信息便算搭建成功。
注释:在我们创建过程中碰到一个问题也分享一下,就是当我们右键点击这个main方法的类时,并没有找到执行这个应用的选项,即没有Run方法,这时候点击下示按钮便可设置出来。
点击后弹出下列页面,点击左边的Module,设置右边的内容,详细原理请看:http://blog.****.net/bug_moving/article/details/62217017
2. 创建不简单的web项目(Spring Boot集成Mybatis)
俗话说,一切不连数据库的web应用都是耍流氓。Spring Boot集成Mybatis的web应用创建过程与前面大致相同,但是,唯一不同的是,在第四步上。
这一页要勾选三个,分别是“Web”、“MySQL”和“MyBatis”。
第一步:创建数据表
表名: user
id | BigInt | Primary key | 用户编号 |
name | Varchar(32) | Not null | 用户名 |
age | Int(3) | Not null | 年龄 |
第二步:创建对应实体类:
第三步:创建mapper接口文件
package com.facebank.springbootmybatis.mapper; @Repository public interface UserMapper { /** * 查询所有用户 * @return */ @Select("SELECT * FROM user") List<User> findAll(); /** * 查询总记录数 * @return */ @Select("SELECT COUNT(*) FROM user") Long findCount(); /** * 通过姓名模糊查询对应用户 * @param name * @return */ @Select("SELECT * FROM user WHERE name LIKE \"%\"#{name}\"%\"") List<User> findByName(String name); /** * 插入/新增新用户 * @param user * @return */ @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") int saveUser(User user); /** * 更新用户信息 * @param user * @return */ @Update("UPDATE user SET name = #{name},age = #{age} WHERE id = #{id}") int updateUser(User user); /** * 根据用户id删除用户信息 * @param id * @return */ @Delete("DELETE FROM user WHERE id = #{id}") int deleteById(Integer id); } |
值得注意的是可以通过注解实现dao层的构建,摒弃了传统使用一个Mapper类对应一个Xml文件的繁杂方式,有时候还会因为找不到对应业务的方法在哪而平白浪费开发时间,降低开发效率。与此对比的是,这种注解的方式可以一一对应查看修改,清晰。
在这个接口上方使用了两个注解,分别是@Mapper和@Repository
(1)@Mapper:这个注解是为了Spring Boot的自动配置机制使用的,通过它可以让整个环境找到这个mapper接口,从而实现数据库的连接和数据获取。
(2)@Repository:这个注解则是为了让Service层在调用mapper时,需要使用@Autowired注解自动注入这个mapper,若没有,则直接编译错误,报Could not found错误。
增删改查对应着四个注解
(3)@Insert
(4)@Delete
(5)@Update
(6)@Select
可以发现,在注解的括号中书写SQL,若是基本类型或者是基本类型的包装类型,则直接对应参数名称在sql中用#{xxx}的方式注入。若是自定义类型(例如User),则也可直接使用自定义类型中的属性变量名称在sql中以#{xxx}注入,而不是#{user.xxx}。
第四步:创建service接口
package com.facebank.springbootmybatis.service; |
第五步:创建service接口对应实现类
package com.facebank.springbootmybatis.service.impl; |
第六步:创建Controller
package com.facebank.springbootmybatis.controller; |
注释:这里可以看到,相对于SpringMVC传统使用@Controller(value=’’,method= RequestMethod.POST) 这种在括号中设置Post或者Get或者其他请求方式的书写方式。Spring Boot提供了更为清晰的注解来分别区分开来。
(1)@GetMapping 对应Get请求,例如查询数据等业务
(2)@PostMapping 对应Post请求,例如添加/保存数据等业务
(3)@PutMapping 对应更新数据等业务
(4)@DeleteMapping 对应删除数据等业务
第七步:测试
首先,点开SpringbootMybatisApplication类,右键或者菜单上点击运行。
然后,点击Tools à Test RESTful webservice 即可打开idea自带的测试web应用的框架。
增—访问地址:http://localhost:8080/user/saveUser
测试结果:
数据库也毫无问题,Good Job!
同理:
删:http://localhost:8080/user/deleteById/5
改:http://localhost:8080/user/updateUser
查:http://localhost:8080/user/findAll
以上测试均无问题。期待你自己run一次。
本程序可上Github拷贝参考,最好就自己做一遍啦。
https://github.com/KrishnnaOUT/spring-mybatis.git
Spring Boot 静态资源访问
关于Spring Boot项目,它与传统项目不同的是,传统项目的页面和css、js等静态资源都是放在WEB-INF下的。当然,css和js也有放在跟WEB-INF同级目录下的。当然,这不是我们讨论的重点。
Spring Boot应用则是别具一格。他的css、js等静态资源都放置在src/main/resouces下的static目录***意:这个static目录就是访问的根目录。举个例子,在static目录中放一张图片A.jpg,那么启动程序后,在浏览器输入http://localhost:8080/A.jpg即可访问到该图片。
除此之外。SpringBoot是不支持Jsp的,这是因为JSP在内嵌的Servlet的容器上运行有一些问题(内嵌Tomcat、Jetty不支持以jar形式运行JSP,Undertow不支持JSP)。
那该怎么办呢。很遗憾的是,唯有学习才能继续开发了。SpringBoot提供了大量模板引擎,包含括FreeMarker、Groovy、Thymeleaf、Velocity和Mustache,Spring Boot中推荐使用Themeleaf作为模板引擎,因为Thymeleaf提供了完美的Spring MVC的支持。
而这些Thymeleaf文件(实际上是后缀为.html的文件)放置在templates目录下的。
3. 相关原理分析
(一)注解分析
(1) @EnableConfigurationProperties:自动映射一个pojo到springboot的配置文件(默认是application.properties文件)的属性集。
(2) @RestController:它继承自@Controller注解,放在表现层,我们都知道,返回json需要@ResponseBody和@Controller配合来标识当前类是一个控制器servlet,@RestController可以代替以上两个注解来使用。而开发rest服务的时候就要使用@RestController。
(3) @SpringBootApplication:是springboot最重要的一个注解,用于快捷配置启动类。源码说明它只是一个配置文件类,它会被@ComponentScan扫描到。源码如下:
分析:可以知道,在@SpringBootApplication注解里比较重要的是这个三个注解:@Configuration、@EnableAutoConfiguration
、@ComponentScan。即若不使用@SpringBootApplication
使用以上三个注解一样可以达到同样的目的。
使用方法:当用idea创建Spring Boot项目时,便自动在主包下创建好了这个配置类。直接便可以运行。它会自动扫描所在类的同级包以及下级包里的Bean(若为JPA项目还可以扫描标注@Entity的实体类)。建议入口类放置的位置在groupId+arctifactID组合的包名下。
排除配置类:若有时候多个配置类存在,而我们想要关闭特定的自动配置应该使用@SpringBootApplication注解的exclude参数,例如:@SpringBootApplication(exclude={myConfiguration.class})
(4) @EnableAutoConfiguration:让Spring Boot 根据类路径中的jar包依赖为当前项目进行自动配置。简单来说,以前我们都是通过手动集成各种xml配置文件,然后在WEB-INF下的web.xml手动填写一下配置的位置来注册。而Spring Boot通过这个简单的注解让这一切都给你自动配置好了,是不是很贴心。
例如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,那么Spring Boot会对Tomcat和Spring MVC进行自动配置。
(二)Spring Boot的配置文件
Spring Boot使用一个全局的配置文件Application.yml 或者Application.properties,放置在src/main/resources目录或者类路径的/config下。
Spring Boot不仅支持常规的properties配置文件,还支持yaml语言的配置文件,yaml是以数据为中心的语言,在配置数据的时候具有面向对象的特征。
Spring Boot的全局配置文件的作用是对一些默认配置的配置值进行修改。如修改Tomcat默认的端口号,并将默认的访问路径“/”修改为“/helloboot”,可以在Application.properties中添加以下代码即可:
该文件还是设置数据源、数据库连接池的地方。如下。
(三)pom.xml
(1)spring-boot-starter-parent
注释:Maven的用户可以通过继承spring-boot-starter-parent项目来获得一些合理的默认配置。这个parent提供了以下特性:
- 默认使用Java 8
- 使用UTF-8编码
- 一个引用管理的功能,在dependencies里的部分配置可以不用填写version信息,这些version信息会从spring-boot-dependencies里得到继承。
- 识别过来资源过滤(Sensible resource filtering.)
- 识别插件的配置(Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).)
- 能够识别application.properties和application.yml类型的文件,同时也能支持profile-specific类型的文件(如: application-foo.properties and application-foo.yml,这个功能可以更好的配置不同生产环境下的配置文件)。
-
maven把默认的占位符${…}改为了@[email protected](这点大家还是看下原文自己理解下吧,我个人用的也比较少
since the default config files accept Spring style placeholders (${…}) the Maven filtering is changed to use @[email protected] placeholders (you can override that with a Maven property resource.delimiter).)
(2)starter pom
本项目中使用到以下starter pom:
<dependency> <dependency> |
Spring Boot为我们提供了简化企业级开发绝大多数场景的starterpom, 只要使用了应用场景所需要的starterpom, 相关的技术配置将会删除,就可以得到SpringBoot为我们提供的自动配置的Bean。简单来说,他帮我们封装好了,就等着我们在pom文件中添加依赖就可以用了。
1. 官方starter pom
名称 | 描述 |
spring-boot-starter | 核心Spring Boot starter,包括自动配置支持,日志和YAML |
spring-boot-starter-actuator | 生产准备的特性,用于帮你监控和管理应用 |
spring-boot-starter-amqp | 对”高级消息队列协议”的支持,通过spring-rabbit实现 |
spring-boot-starter-aop | 对面向切面编程的支持,包括spring-aop和AspectJ |
spring-boot-starter-batch | 对Spring Batch的支持,包括HSQLDB数据库 |
spring-boot-starter-cloud-connectors | 对Spring Cloud Connectors的支持,简化在云平台下(例如,Cloud Foundry 和Heroku)服务的连接 |
spring-boot-starter-data-elasticsearch | 对Elasticsearch搜索和分析引擎的支持,包括spring-data-elasticsearch |
spring-boot-starter-data-gemfire | 对GemFire分布式数据存储的支持,包括spring-data-gemfire |
spring-boot-starter-data-jpa | 对”Java持久化API”的支持,包括spring-data-jpa,spring-orm和Hibernate |
spring-boot-starter-data-mongodb | 对MongoDB NOSQL数据库的支持,包括spring-data-mongodb |
spring-boot-starter-data-rest | 对通过REST暴露Spring Data仓库的支持,通过spring-data-rest-webmvc实现 |
spring-boot-starter-data-solr | 对Apache Solr搜索平台的支持,包括spring-data-solr |
spring-boot-starter-freemarker | 对FreeMarker模板引擎的支持 |
spring-boot-starter-groovy-templates | 对Groovy模板引擎的支持 |
spring-boot-starter-hateoas | 对基于HATEOAS的RESTful服务的支持,通过spring-hateoas实现 |
spring-boot-starter-hornetq | 对”Java消息服务API”的支持,通过HornetQ实现 |
spring-boot-starter-integration | 对普通spring-integration模块的支持 |
spring-boot-starter-jdbc | 对JDBC数据库的支持 |
spring-boot-starter-jersey | 对Jersey RESTful Web服务框架的支持 |
spring-boot-starter-jta-atomikos | 对JTA分布式事务的支持,通过Atomikos实现 |
spring-boot-starter-jta-bitronix | 对JTA分布式事务的支持,通过Bitronix实现 |
spring-boot-starter-mail | 对javax.mail的支持 |
spring-boot-starter-mobile | 对spring-mobile的支持 |
spring-boot-starter-mustache | 对Mustache模板引擎的支持 |
spring-boot-starter-redis | 对REDIS键值数据存储的支持,包括spring-redis |
spring-boot-starter-security | 对spring-security的支持 |
spring-boot-starter-social-facebook | 对spring-social-facebook的支持 |
spring-boot-starter-social-linkedin | 对spring-social-linkedin的支持 |
spring-boot-starter-social-twitter | 对spring-social-twitter的支持 |
spring-boot-starter-test | 对常用测试依赖的支持,包括JUnit, Hamcrest和Mockito,还有spring-test模块 |
spring-boot-starter-thymeleaf | 对Thymeleaf模板引擎的支持,包括和Spring的集成 |
spring-boot-starter-velocity | 对Velocity模板引擎的支持 |
spring-boot-starter-web | 对全栈web开发的支持,包括Tomcat和spring-webmvc |
spring-boot-starter-websocket | 对WebSocket开发的支持 |
spring-boot-starter-ws | 对Spring Web服务的支持 |
相关starter pom具体资料可以查看官网:
http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#using-boot-starter
2. 第三方 starter pom(不常用,不做记录。)
三.spring Boot其他相关知识点(扩展)
https://www.jianshu.com/p/9a08417e4e84
推荐学习文献:JavaEE开发的颠覆者 Spring Boot实战