《深入实践Spring Boot》阅读笔记之一:基础应用开发
上上篇「1718总结与计划」中提到,18年要对部分项目拆分,进行服务化,并对代码进行重构。公司技术委员会也推荐使用spring boot,之前在各个技术网站中也了解过,它可以大大简化spring配置和各个组件的使用,与其关系密切的Spring Cloud可以很好支持微服务的开发。
为了后续项目的应用,想利用这2天看下《深入实践Spring Boot》,这本书是17年双十一期间在京东上买的,一直懒着没看。这本书偏应用,适合初学者看,正文内容也就240多页,看的会比较轻松。
目前,看完了第一部分,约占全书1/2内容,计划初七上班前看完这本书。我会分3篇文章进行介绍,这篇文章首先介绍下这本书的整体结构,然后总结下第一部分的内容。
我不会介绍具体的实现过程,只是把这本书想要讲的内容串起来,重点说明下我认为重要的内容。想深入了解的,可以直接看这本书,也可以通过文中的一些概念搜索相关的文章阅读。
书籍整体结构
Spring Boot 是在Spring框架基础上创建的一个全新框架,其设计目的是简化Spring应用的搭建和开发过程,不但具有Spring的所有优秀特性,而且具有如下显著特点:
- 为Spring开发提供更加简单的使用和快速开发的技巧;
- 具有开箱即用的默认配置功能,能根据项目依赖自动配置;
- 具有功能更加强大的服务体系,包括嵌入式服务、安全、性能指标、监控检查等;
- 可以不再需要XML配置,让应用更加轻巧和灵活;
2014年4月发布了1.0.0版本,目前有2个版本,v1最新版本为v1.5.10,v2最新版本为v2.0.0.RC1。
本书从技术、实践和原理3个维度对Spring Boot进行了系统且深入的讲解,作者由浅入深逐步带我们了解Spring Boot。
第一部分 - 技术维度
针对性地介绍了Spring Boot入门、数据库的使用和访问性能提升、界面设计、安全设计等重要技术知识,以实用性为主,帮助我们快速掌握Spring Boot开发方法和精髓,尽快融入生产实践中。
第二部分 - 实践维度
用生产环境中的实际案例讲解如何使用Spring Boot开发分布式应用和云应用,以及如何用微服务构建高可用的服务平台。
第三部分 - 原理维度
从源码层面着重分析了Spring Boot的程序加载、自动配置、数据管理、S
pring Cloud的配置管理、发现服务和负载均衡服务等核心功能的实现原理,帮助我们更深刻理解Spring Boot开发,掌握其精髓。
很喜欢作者的章节安排,以后学习新技术时,可以按照这个思路去学习。
Spring Boot入门
本章主要介绍开发环境的配置,包括安装JDK,安装IDEA、安装Maven、安装Git客户端,创建了一个简单的项目,演示如何使用Spring Boot。
使用Spring Initializr创建项目
IDEA提供了可视化的界面创建各种类型的项目,可以通过Spring Initializr的方式,按要求创建Spring Boot项目。
一个简单demo
项目创建完成后,会生成一个入口Applicaton类,进行如下的修改,就可提供reset接口,供使用者访问。
@SpringBootApplication
@RestController
public class BookPart1Application {
@RequestMapping("/")
String home(){
return "hello";
}
public static void main(String[] args) {
SpringApplication.run(BookPart1Application.class, args);
}
}
运行与发布
运行Spring Boot项目很简单,像普通项目一样直接运行即可。
如果要发布到线上Tomcat容器中,需要增加一个打包插件:spring-boot-maven-plugin,通过mvn package打包即可。
Spring Boot配置
可以在工程的resources文件夹中创建一个application.properties或application.yml文件,该文件会被发布在classpath中,被Spring Boot自动读取。 作者推荐使用application.yml文件,因为它提供结构化及其嵌套的格式。
server:
tomcat:
uri-encoding: UTF-8
port: 80
使用数据库
使用数据库是开发基本应用的基础,Spring Boot 提供更加高层次上访问数据库。本章通过介绍使用MySQL、Redis、MongoDB、Neo4j来说明Spring Boot提供的便捷性。
使用MySQL
对于传统关系型数据库来说,Spring Boot使用JPA资源库来实现对数据库的操作,JPA是为POJO提供持久化的标准规范,即将Java的普通对象通过对象关系映射持久化到数据库中。
作者通过「实体建模」-> 「实体持久化」-> 「测试程序」的思路介绍MySQL的使用。
实体建模是通过注解描述与数据库的对应关系,包括实体的属性、实体之间的关系。
实体持久化是Spring Data提供的强大功能,通过继承于JPA资源库JpaRepository接口,就可以对数据库进行增删改查、分页查询和指定排序的字段等操作,不需要自己实现。
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAll(Iterable<ID> var1);
<S extends T> List<S> save(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
JPA还提供了一些自定义声明方法的规则,这些方法也不用实现,JPA将会代理实现这些方法,十分方便。
使用Redis
Redis没有表结构的概念,所以要实现MySQL数据库表的数据在Redis中存取,必须做一些转换,可以使用JSON格式的文本作为Redis与Java普通对象互相交换数据的存储格式。
通过RedisTemplate可以很方便的操作Redis。
对于Redis的使用,还可以将注解方式(@Cacheable、@CachePut、@CacheEvict)与调用数据库的方法相结合,就不用编写redis操作服务类了,使用起来也更简单。不过只能对简单对象进行相关操作,对于想实体User包含一定关系的复杂对象,或其他集合、列表对象,就不能使用简单注解方式来实现,还得使用RedisTemplate。
public class RoleService {
@Autowired
private RoleRepository roleRepository;
@Autowired
private RoleRedis roleRedis;
@Cacheable(value = "mysql:findById:role", keyGenerator = "simpleKey")
public Role findById(Long id) {
return roleRepository.findOne(id);
}
@CachePut(value = "mysql:findById:role", keyGenerator = "objectId")
public Role create(Role role) {
return roleRepository.save(role);
}
@CachePut(value = "mysql:findById:role", keyGenerator = "objectId")
public Role update(Role role) {
return roleRepository.save(role);
}
@CacheEvict(value = "mysql:findById:role", keyGenerator = "simpleKey")
public void delete(Long id) {
roleRepository.delete(id);
}
}
使用MongoDB
MongoDB是文档型的NoSQL数据库,具有大数据量、高并发等优势,但缺点是不能建立实体关系,而且也没有事务管理机制。
MongoDB 也有像使用JPA那样的资源库,引入spring-data-mongodb和spring-boot-starter-hateoas依赖库,这里就不过多介绍了。
使用Neo4j
Neo4j是一个高性能的NoSQL图数据库,并且具备完全事务特性,同时具备传统关系型数据库的优点,又具备NOSQL数据库优势。
Neo4j将结构化数据存储在一张图上,图中每一个节点的属性表示数据的内容,每一条有向边表示数据的关系。它没有表结构的概念,它的数据用节点的属性来表示。
举个例子,现在有演员和电影两个实体,它们的关系表现为一个演员在一部电影中扮演一个角色。那么就可以创建演员和电影两个节点实体,和一个角色关系实体。
它更加形象和贴切地表现了实体之间的关系,而且这个实体-关系模型是可以不经过任何转换而直接存入数据库的,这将很大程度上减轻设计工作和沟通成本。
像JPA使用了ORM一样,Neo4j使用了对象-图形映射OGM的方式来建模。
@RelationshipEntity(type = "ACTS_IN")
public class Role {
@GraphId
Long id;
String role;
@StartNode
Actor actor;
@EndNode
Movie movie;
public Role() {
}
public Role(Actor actor, Movie movie, String name) {
this.actor = actor;
this.movie = movie;
this.role = name;
}
}
从上面的介绍可以看出,在Spring Boot框架中使用数据库非常简单、容易,主要得益于Spring Boot资源库的强大功能,Spring Boot整合了第三方资源,把复杂的操作变成简单的调用。
界面设计
本章使用Spring Boot框架设计Web显示界面,使用MVC的概念将数据管理、事件控制、界面显示进行分层处理,实现多层结构设计。使用过MVC框架的比较好理解,这里就不过多说明了。
其中界面显示使用Thymeleaf模板,之前没接触过,简单说明下。Thymeleaf是现代化服务器端的Java模板引擎,不同与JSP和FreeMarker,Thymeleaf的语法更加接近HTML,并且也有不错的扩展性。
提高数据库访问性能
使用关系型数据库的应用系统的性能瓶颈最终还是数据库。本章通过以下几种方式提高数据库访问性能:
- 使用Druid
- 扩展JPA功能
- 使用Redis做缓存
使用Druid
Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,在监控、可扩展性、稳定性和性能方面具有明显的优势。通过使用Druid连接池,可以一定程度上提高数据库的访问性能。
扩展JPA功能
使用JPA,在资源库接口定义中不但可以按照其规则约定的方法声明各种方法,还可以使用注解@Query来定义一些简单的查询语句,优化SQL语句。
可以通过自定义一个接口,继承于JpaRepository,扩展已有的JPA接口。自定义接口必须在程序启动时装配,才能正常使用。然后,在JPA配置类中,通过@EnableJpaRepositories加载定义的装配类。
public interface UserRepository extends ExpandJpaRepository<User, Long> {
@Query("select t from User t where t.name =?1 and t.email =?2")
User findByNameAndEmail(String name, String email);
@Query("select t from User t where t.name like :name")
Page<User> findByName(@Param("name") String name, Pageable pageRequest);
}
使用Redis做缓存
前面「使用Redis」已经介绍。
安全设计
Web应用的安全管理,主要包括两个方面的内容:一方面是用户身份验证,即用户登录的设计;另一方面是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理。
权限管理的设计一般使用角色来管理,给一个用户赋予哪些角色,用户就具有哪些权限。本章主要使用spring-cloud-security来进行安全管理设计。
使用时,需要继承spring-cloud-starter-parent,并引入spring-cloud-starter-security依赖。
关于系统的安全管理及各种设计,Spring Security已经大体上都实现了,只需要进行一些配置和引用,就能够正常使用了。具体实现就不在此重复描述了。
好多实现细节,我没有展现出来,一方面会显得篇幅太长,主次不鲜明,另一方面作者把所有代码都放到github了(http://github.com/chenfromsz)。
后续在公司项目中实践好,我再谈谈自己的使用经验。

《深入实践Spring Boot》阅读笔记之一:基础应用开发的更多相关文章
- 《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析
刚关注的朋友,可以回顾前两篇文章: 基础应用开发 分布式应用开发 上篇文章总结了<深入实践Spring Boot>的第二部分,本篇文章总结第三部分,也是最后一部分.这部分主要讲解核心技术的 ...
- 《深入实践Spring Boot》阅读笔记之二:分布式应用开发
上篇文章总结了<深入实践Spring Boot>的第一部分,这篇文章介绍第二部分:分布式应用开发,以及怎么构建一个高性能的服务平台. 主要从以下几个方面总结: Spring Boot SS ...
- Spring Boot学习笔记2——基本使用之最佳实践[z]
前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建
Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...
- Spring Boot学习笔记---Spring Boot 基础及使用idea搭建项目
最近一段时间一直在学习Spring Boot,刚进的一家公司也正好有用到这个技术.虽然一直在学习,但是还没有好好的总结,今天周末先简单总结一下基础知识,等有时间再慢慢学习总结吧. Spring Boo ...
- 后端开发实践——Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
- Spring Boot 学习笔记
参考资料 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ Spring Boot简介 Spring Boot使 ...
- Spring Boot 1.5.x 基础学习示例
一.为啥要学Spring Boot? 今年从原来.Net Team“被”转到了Java Team开始了微服务开发的工作,接触了Spring Boot这个新瓶装旧酒的技术,也初步了解了微服务架构.Spr ...
随机推荐
- spring boot rest例子
简介: 本文将帮助您使用 Spring Boot 创建简单的 REST 服务. 你将学习 什么是 REST 服务? 如何使用 Spring Initializr 引导创建 Rest 服务应用程序? 如 ...
- 【Unity与23种设计模式】解释器模式(Interpreter)
GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...
- Zookeeper技术分享
内容整理自组内分享PPT 一.概述 ZooKeeper 遵循一个简单的客户端-服务器模型,其中客户端 是使用服务的节点(即机器),而服务器 是提供服务的节点.ZooKeeper 服务器的集合形成了一个 ...
- jni 类初始化失败(nested exception is java.lang.NoClassDefFoundError)
nested exception is java.lang.NoClassDefFoundError: Could not initialize class com.netease.facedetec ...
- CCF-CSP 201709-4通信网络
问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息.信息可以通过中转的方式进行传递,即如果a能将信息 ...
- Mycat 分片规则详解--日期(天)分片
实现方式:按照日期来分片 优点:使数据按照日期来进行分时存储 缺点:由于数据是连续的,所以该方案不能有效的利用资源 配置示例: <tableRule name="sharding-by ...
- 从 MVC 到前后端分离
从 MVC 到前后端分离 1 理解 MVC MVC 是一种经典的设计模式,全名为 Model-View-Controller,即 模型-视图-控制器. 其中,模型 是用于封装数据的载体,例如,在 Ja ...
- python函数知识点(详解匿名函数)
Python函数是组织好的.单一的.具有独立功能模块的代码块. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定 ...
- 小委出发vijos-1572 jdoj-1572
小委出发 题目大意:一个长度为n的字符串,由()[]{}组成.求最长的和谐字符串:我们对最长和谐字符串的定义就是每一个括号有一个性质相同的括号与之匹配,这两个括号中间要么为空,要么也是和谐的.几个连续 ...
- apache实现301永久性重定向代码
301重定向(301 redirect)又叫301代表永久性转移(Permanently Moved),将各种网络请求重新定个方向转到其它位置,是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬 ...