为了后续项目的应用,想利用这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 进阶笔记(详细全面) 中文PDF完整版.pdf》是一份非常实用的Spring Boot进阶学习资料,适用于已经掌握基础知识的开发者,希望深入学习Spring Boot框架的高级应用。 本资料主要包含了Spring Boot的高级...
Spring Boot 学习笔记完整教程
Spring Boot笔记
Spring Boot使得创建独立的,基于生产级别的基于Spring的应用程序变得容易,您可以“运行”它们。 大多数Spring Boot应用程序需要最少的Spring配置。 SpringBoot其实就是构建Spring应用程序的“脚手架”,能够帮助...
Spring Boot 学习笔记完整教程
Spring Boot 进阶笔记.pdf
Spring Boot 是一个快速开发框架,可以迅速搭建出一套基于 Spring 框架体系的应用,是 Spring Cloud 的基础。 Spring Boot 开启了各种自动装配,从而简化代码的开发,不需要编写各种配置文件,只需要引入相关依赖就...
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。...通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
Spring Boot学习笔记,大三上学期开始学习Spring boot。
springboot的入门技术,详细的介绍了相关的技术信息,从spring的注解开发到最终的springboot整合mybatis,redis集群的组合都有详细的介绍
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅... 本文档是Spring框架高级源码笔记+Spring Boot data mongoDB中文文档 资源合集
Spring Boot核心笔记.rar
springboot_笔记.pdf ,来自视频教程,适用于快速需要入门的小伙伴
本人springboot学习笔记总结,根据视频初学,感兴趣可下载。
Spring Boot课堂笔记.md
吴恩达老师的深度学习课程笔记及资源 Spring Boot基础教程 Spring Boot 2 x版本连载中 帮助 Android App 进行组件化改造的路由框架 最接近原生APP体验的高性能框架基于Vue3 Element Plus 的后台管理系统解决方案...
尚硅谷Spring Boot 课程笔记,视屏链接为https://www.bilibili.com/video/av36291265/?p=9&t=161