《深刻实践Spring Boot》阅读笔记:基础应用开发

上上篇「1718总结与计划」中提到,18年要对部分项目拆分,进行服务化,并对代码进行重构。公司技术委员会也推荐使用spring boot,以前在各个技术网站中也了解过,它能够大大简化spring配置和各个组件的使用,与其关系密切的Spring Cloud能够很好支持微服务的开发。java

为了后续项目的应用,想利用这2天看下《深刻实践Spring Boot》,这本书是17年双十一期间在京东上买的,一直懒着没看。这本书偏应用,适合初学者看,正文内容也就240多页,看的会比较轻松。mysql

目前,看完了第一部分,约占全书1/2内容,计划初七上班前看完这本书。我会分3篇文章进行介绍,这篇文章首先介绍下这本书的总体结构,而后总结下第一部分的内容。git

我不会介绍具体的实现过程,只是把这本书想要讲的内容串起来,重点说明下我认为重要的内容。想深刻了解的,能够直接看这本书,也能够经过文中的一些概念搜索相关的文章阅读。github

书籍总体结构

Spring Boot 是在Spring框架基础上建立的一个全新框架,其设计目的是简化Spring应用的搭建和开发过程,不但具备Spring的全部优秀特性,并且具备以下显著特色:redis

  • 为Spring开发提供更加简单的使用和快速开发的技巧;
  • 具备开箱即用的默认配置功能,能根据项目依赖自动配置;
  • 具备功能更增强大的服务体系,包括嵌入式服务、安全、性能指标、监控检查等;
  • 能够再也不须要XML配置,让应用更加轻巧和灵活;

2014年4月发布了1.0.0版本,目前有2个版本,v1最新版本为v1.5.10,v2最新版本为v2.0.0.RC1。spring

本书从技术、实践和原理3个维度对Spring Boot进行了系统且深刻的讲解,做者由浅入深逐步带咱们了解Spring Boot。sql

第一部分 - 技术维度

针对性地介绍了Spring Boot入门、数据库的使用和访问性能提高、界面设计、安全设计等重要技术知识,以实用性为主,帮助咱们快速掌握Spring Boot开发方法和精髓,尽快融入生产实践中。mongodb

第二部分 - 实践维度

用生产环境中的实际案例讲解如何使用Spring Boot开发分布式应用和云应用,以及如何用微服务构建高可用的服务平台。数据库

第三部分 - 原理维度

从源码层面着重分析了Spring Boot的程序加载、自动配置、数据管理、S pring Cloud的配置管理、发现服务和负载均衡服务等核心功能的实现原理,帮助咱们更深入理解Spring Boot开发,掌握其精髓。缓存

很喜欢做者的章节安排,之后学习新技术时,能够按照这个思路去学习。

Spring Boot入门

本章主要介绍开发环境的配置,包括安装JDK,安装IDEA、安装Maven、安装Git客户端,建立了一个简单的项目,演示如何使用Spring Boot。

使用Spring Initializr建立项目

IDEA提供了可视化的界面建立各类类型的项目,能够经过Spring Initializr的方式,按要求建立Spring Boot项目。

Spring Initializr

一个简单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将结构化数据存储在一张图上,图中每个节点的属性表示数据的内容,每一条有向边表示数据的关系。它没有表结构的概念,它的数据用节点的属性来表示。

举个例子,如今有演员和电影两个实体,它们的关系表现为一个演员在一部电影中扮演一个角色。那么就能够建立演员和电影两个节点实体,和一个角色关系实体。

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了(github.com/chenfromsz)。 后续在公司项目中实践好,我再谈谈本身的使用经验。

情情说
相关文章
相关标签/搜索