Springboot教程六——项目信息

源码链接:
https://github.com/EternalPeace/springboot


1.1    spring属性文件项目

Spring Boot能够对应用进行自动化配置。

Spring Boot 不光从 application.properties获取配置,也可以在程序中多种设置配置属性,如下:

1.命令行参数

2.java:comp/env里的 JNDI 属性

3.JVM系统属性

4.操作系统环境变量

5.RandomValuePropertySource属性类生成的 random.* 属性

6.应用以外的 application.properties(或 yml)文件

7.打包在应用内的 application.properties(或 yml)文件

8.在应用 @Configuration 配置类中,用 @PropertySource 注解声明的属性文件

9.SpringApplication.setDefaultProperties声明的默认属性

  导入项目后运行 springboot-properties工程PropertiesTest测试类的 getHomeProperties 方法。可以在控制台看到输出,这是通过自定义属性获取的值:

  输出如下:

HomeProperties{province='ZheJiang',city='HangZhou', desc='dev: At ZheJiang HangZhou.'}

  在 application.properties 中对应 HomeProperties 对象字段编写属性。

  通过 @ConfigurationProperties(prefix= "home”) 注解,将配置文件中以 home 前缀的属性值自动绑定到对应的字段中。用 @Component 作为 Bean 注入到Spring 容器中。

  用 application.yml 的文件,键值对冒号后面,必须空一格。

  注意:application.properties 配置中文值的时候,读取出来的属性值会出现乱码问题。但是 application.yml 不会出现乱码问题。原因是,Spring Boot 是以 iso-8859的编码方式读取 application.properties 配置文件。

  在很多场景下的配置,比如数据库配置、Redis配置、注册中心和日志配置等。在不同的环境,我们需要不同的包去运行项目。项目结构中有两个环境的配置。

application-dev.properties:开发环境

application-prod.properties:生产环境

Spring Boot 是通过application.properties 文件中,设置spring.profiles.active 属性,比如,配置了 dev ,则加载的是 application-dev.properties

           pring.profiles.active设置为prod,运行输出如下:

HomeProperties{province='ZheJiang', city='HangZhou', desc='prod: AtZheJiang HangZhou.'}

  根据优先级, jar 运行的方式,通过设置 -Dspring.profiles.active=prod 去指定相应的配置。

1.2    Restful项目

  REST 是属于 WEB 自身的一种架构风格,是在 HTTP 1.1 规范下实现的。Representational State Transfer 全称翻译为表现层状态转化。

  五个关键要素:

n   资源(Resource)

n   资源的表述(Representation)

n   状态转移(StateTransfer)

n   统一接口(UniformInterface)

n   超文本驱动(HypertextDriven)

 

1.2.1 HTTP 知识

GET           请求获取Request-URI所标识的资源

POST          在Request-URI所标识的资源后附加新的数据

HEAD         请求获取由Request-URI所标识的资源的响应消息报头

PUT           请求服务器存储一个资源,并用Request-URI作为其标识

DELETE       请求服务器删除Request-URI所标识的资源

TRACE        请求服务器回送收到的请求信息,主要用于测试或诊断

CONNECT  保留将来使用

OPTIONS   请求查询服务器的性能,或者查询与资源相关的选项和需求

 

 

 

 

 

 

 

 

1.2.2 准备数据库

  创建数据库:

CREATE DATABASE restfuldb;

  创建城市表:

DROP TABLE IF EXISTS  `city`;

CREATETABLE `city` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENTCOMMENT '城市编号',

  `province_id` int(10) unsigned  NOT NULL COMMENT '省份编号',

  `city_name` varchar(25) DEFAULT NULL COMMENT'城市名称',

  `description` varchar(25) DEFAULT NULLCOMMENT '描述',

  PRIMARY KEY (`id`)

)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

  插入数据:

INSERTcityVALUES(1 ,1,'杭州市','AT杭州。');

  工程项目目录:

org.spring.springboot.controller- Controller

org.spring.springboot.dao- 数据操作层 DAO

org.spring.springboot.domain- 实体类

org.spring.springboot.service- 业务逻辑层

Application- 应用启动类

application.properties- 应用配置文件,应用启动会自动读取配置

  需要在application.properties 文件中修改数据库配置。

1.2.3  代码说明

 

//mapper接口类扫描包配置,@MapperScan("org.spring.springboot.dao")

@RequestMapping 处理请求地址映射。

method - 指定请求的方法类型:POST/GET/DELETE/PUT

value - 指定实际的请求地址

consumes - 指定处理请求的提交内容类型,例如 Content-Type头部设置    application/json, text/html

produces - 指定返回的内容类型

@PathVariableURL 映射时,用于绑定请求参数到方法参数

@RequestBody这里注解用于读取请求体 boy 的数据,通过HttpMessageConverter 解析绑定到对象中

其中CityMapper.xml文件是Mabatis的映射文件。

 

 

 

 

1.2.4 运行

  右键运行Application 应用启动类的 main 函数。用postman 工具可以如下操作,根据 ID,获取城市信息

GET http://127.0.0.1:8080/api/city/1

显示:

{

    "id": 1,

    "provinceId": 1,

    "cityName": "杭州市",

    "description": "AT杭州。"

}

获取城市列表

GET http://127.0.0.1:8080/api/city

新增城市信息

POSThttp://127.0.0.1:8080/api/city

更新城市信息

PUT http://127.0.0.1:8080/api/city

删除城市信息

DELETEhttp://127.0.0.1:8080/api/city/2

 

1.3    Restful api项目

REST API是基于RESTful架构的一套互联网分布式的API设计理论。和上面资源,状态和统一接口有着密切的关系。

  有两个模式

MVC模式:

RESTAPI模式:

RESTful针对资源的方法定义分简单和关联复杂两种。

  基本方法定义:

GET /user # 获取user列表

GET /user/3 # 查看序号为3user

POST /user # 新建一个user

PUT /user/3  # 更新序号为3user

DELETE /user/3 #删除user 3

  资源之间的关联方法如下定义:

GET /admin/1/user/10 # 管理员1号,查看序号为3user信息

1.3.1 权限控制

RESTful是无状态的,所以每次请求就需要对起进行认证和授权。

  身份认证,即登录验证用户是否拥有相应的身份。简单的说就是一个Web页面点击登录后,服务端进行用户密码的校验。

  在身份认证后,验证该身份具体拥有某种权限。即针对于某种资源的CRUD,不同用户的操作权限是不同的。

 

1.4    Freemaker项目

FreeMarker是一款模板引擎:一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarkerTemplate LanguageFTL),属于简单、专用的语言。

DAO 数据库操作层依旧用的是 Mybatis

数据库准备同Restful项目。

项目结构如下:

l  org.spring.springboot.controller -Controller

l  org.spring.springboot.dao - 数据操作层 DAO

l  org.spring.springboot.domain - 实体类

l  org.spring.springboot.service - 业务逻辑层

l  Application - 应用启动类

l  resources/application.properties - 应用配置文件,应用启动读取配置

l  resources/web - *.ftl文件,是 FreeMarker 文件配置路径。在 application.properties 配置

l  resources/mapper - DAO Maper XML 文件

1.4.1 代码说明

 

pom.xml 依赖中增加 SpringBoot FreeMarker 依赖。

       <!-- Spring Boot Freemarker 依赖 -->

       <dependency>

          <groupId>org.springframework.boot</groupId>

          <artifactId>spring-boot-starter-freemarker</artifactId>

       </dependency>

application.properties 中加入 FreeMarker 相关的配置

           关于freeemaker的详细配置如下:

spring.freemarker.allow-request-override=false# Set whether HttpServletRequest attributes are allowed to override (hide)controller generated model attributes of the same name.

spring.freemarker.allow-session-override=false# Set whether HttpSession attributes are allowed to override (hide) controllergenerated model attributes of the same name.

spring.freemarker.cache=false# Enable template caching.

spring.freemarker.charset=UTF-8# Template encoding.

spring.freemarker.check-template-location=true# Check that the templates location exists.

spring.freemarker.content-type=text/html# Content-Type value.

spring.freemarker.enabled=true# Enable MVC view resolution for this technology.

spring.freemarker.expose-request-attributes=false# Set whether all request attributes should be added to the model prior tomerging with the template.

spring.freemarker.expose-session-attributes=false# Set whether all HttpSession attributes should be added to the model prior tomerging with the template.

spring.freemarker.expose-spring-macro-helpers=true# Set whether to expose a RequestContext for use by Spring's macro library,under the name "springMacroRequestContext".

spring.freemarker.prefer-file-system-access=true# Prefer file system access for template loading. File system access enableshot detection of template changes.

spring.freemarker.prefix=# Prefix that gets prepended to view names when building a URL.

spring.freemarker.request-context-attribute=# Name of the RequestContext attribute for all views.

spring.freemarker.settings.*=# Well-known FreeMarker keys which will be passed to FreeMarker'sConfiguration.

spring.freemarker.suffix=# Suffix that gets appended to view names when building a URL.

spring.freemarker.template-loader-path=classpath:/templates/# Comma-separated list of template paths.

spring.freemarker.view-names=# White list of view names that can be resolved.

1.4.2 展示层Controller 详解

  示例项目中不走 HTTP + JSON 模式,使用了 @Controller ,而不是@RestController

  方法返回值是 String 类型,和 application.properties 配置的 Freemarker 文件配置路径下的各个 *.ftl 文件名一致。这样才会准确地把数据渲染到 ftl文件里面进行展示。

  使用 Model 类,向 Model 加入数据,并指定在该数据在 Freemarker取值指定的名称。

FreeMarker 是常用的模板引擎,很多Web 开发的必选。

 

1.4.3 执行

http://127.0.0.1:8080/api/city/1

显示:

City:杭州市

Q:WhyI like? 

A:AT杭州。!

http://127.0.0.1:8080/api/city

显示:

City:杭州市
Q:Why I like? 
A:AT
杭州。! City: 杭州市
Q:Why I like? 
A:AT
杭州。!

 

1.5    异常梳理

 

  在前后端分离开发中,经常用 HTTP over JSON 作为服务进行前后端联调对接。

可以实现低耦合,模块化,前后端之间利用轻量级协议对接耦合;便于敏捷开发,后端给出 api文档,前端根据文档,做数据开发;后端实现业务逻辑。

  那么怎么统一处理认为是异常的场景?

  可以根据 ControllerAdvice 实现。可以直接利用RestControllerAdvice ,控制层通知器,这里用于统一拦截异常,进行响应处理。工作模式,如图:

1.5.1 运行项目

 

访问浏览器打开下面链接,可得到以下JSON 返回

http://localhost:8080/api/city?cityName=

{"code":"000001","message":"paramsno complete","result":null}

访问浏览器打开下面链接,可得到以下JSON 返回。

http://localhost:8080/api/city?cityName=hello

{"code":"0","message":"success","result":{"id":1,"provinceId":2,"cityName":"杭州","description":"AT杭州"}}

 

1.5.2 代码解释

  控制层通知器GlobalErrorInfoHandler.java 

@ExceptionHandler 注解,标记了使用errorHandlerOverJson() 方法来处理 GlobalErrorInfoException 异常。

@RestControllerAdvice  @ControllerAdvice @ResponseBody 的语义结合。是控制器增强,直接返回对象。这里用于统一拦截异常,然后返回错误码对象体。

@ResponseBody 作用:该注解用于将Controller 的方法返回的对象,通过适当的 HttpMessageConverter 转换为指定格式后,写入到 Response 对象的 body 数据区。

  定义了一个错误码接口,全局错误码枚举和各个业务错误码枚举去实现接口,并用枚举值枚举出错误码及错误码消息列表。如图:

 

1.6    webflux项目

前端技术中最耀眼的明星就是ReactReact 起源于Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。

Flux 是一种架构思想,专门解决软件的结构问题。

React 本身只涉及UI层,如果搭建大型应用,必须搭配一个前端框架。也就是说,你至少要学两样东西,才能基本满足需要:React+ 前端框架。

由于React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web开发的主流工具。

这个项目本身也越滚越大,从最早的UI引擎变成了一整套前后端通吃的 Web App 解决方案。衍生的React Native 项目,目标更是宏伟,希望用写 Web App 的方式去写 Native App。如果能够实现,整个互联网行业都会被颠覆,因为同一组人只需要写一次 UI ,就能同时运行在服务器、浏览器和手机

1.6.1 WebFlux介绍

WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于Reactor 中的类 Flux。该模块中包含了对反应式 HTTP、服务器推送事件和WebSocket 的客户端和服务器端的支持。对于开发人员来说,比较重要的是服务器端的开发。在服务器端,WebFlux支持两种不同的编程模型:第一种是 Spring MVC 中使用的基于Java 注解的方式;第二种是基于 Java 8 lambda 表达式的函数式编程模型。这两种编程模型只是在代码编写方式上存在不同。WebFlux需要底层提供运行时的支持,WebFlux 可以运行在支持Servlet 3.1 非阻塞 IO API Servlet 容器上,或是其他异步运行时环境。

WebFlux 所使用的类型是与反应式编程相关的Flux Mono 等,而不是简单的对象。

 

1.7    Elasticsearch项目

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

1.7.1 项目结构

org.spring.springboot.controller- Controller

org.spring.springboot.repository- ES 数据操作层

org.spring.springboot.domain- 实体类

org.spring.springboot.service- ES 业务逻辑层

Application- 应用启动类

application.properties- 应用配置文件,应用启动会自动读取配置

Elasticsearch 基本术语:

  文档(Document)、索引(Index)、类型(Type)文档三要

  集群(Cluster)、节点(Node)、分片(Shard)分布式三要素

 

1.7.2 项目运行

  准备es进程:

  下载:https://www.elastic.co/downloads/past-releases/elasticsearch-2-3-2

  解压后直接启动运行。

           接着运行项目即可。

POSThttp://127.0.0.1:8080/api/city

{

"id":"1",

"provinceid":"1",

"cityname":"杭州",

"description":"AT杭州"

}

POSThttp://127.0.0.1:8080/api/city

{

"id":"2",

"provinceid":"2",

"cityname":"杭州",

"description":"AT杭州"

}

浏览器中运行:

http://localhost:8080/api/city/search?pageNumber=0&pageSize=10&searchContent=1

得到如下:
  [{"id":2,"provinceid":null,"cityname":null,"description":"AT杭州。"},{"id":1,"provinceid":null,"cityname":null,"description":"AT杭州。"}]

 

1.7.3 代码解释

application.properties配置 ES 地址

默认 9300 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。

更多配置:

spring.data.elasticsearch.cluster-nameElasticsearch 集群名。(默认值: elasticsearch)

spring.data.elasticsearch.cluster-nodes集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点。

spring.data.elasticsearch.propertie用来配置客户端的额外属性。

spring.data.elasticsearch.repositories.enabled开启 Elasticsearch 仓库。(默认值:true)

  接口只要继承 ElasticsearchRepository 类即可。默认会提供很多实现,比如 CRUD 和搜索相关的实现。

1.8    dubbo项目

Dubbo是阿里巴巴公司开源的一个高性能服务框架,使得应用可通过高性能的 RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。

Dubbo更是 SOA服务治理的一种方案。

  核心:

1. 远程通信,向本地调用一样调用远程方法。

2. 集群容错

3. 服务自动发现和注册,可平滑添加或者删除服务提供者。

1.8.1 ZooKeeper

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

1.8.2 项目运行

  先运行zookeeper进程。

  下载 ZooKeeper,地址http://www.apache.org/dyn/closer.cgi/zookeeper

解压 ZooKeeper

conf 目录新建zoo.cfg zoo.cfg 代码如下(自己指定 log 文件目录):

tickTime=2000

dataDir=/javaee/zookeeper/data 

dataLogDir=/javaee/zookeeper/log

clientPort=2181

bin 目录下,启动ZooKeeper

./zkServer.sh start

然后运行服务端,

接着运行客户端即可。

 

1.8.3 代码说明

pom.xml 填写依赖的 spring-boot-starter-dubbo工程

application.properties配置dubbo

##Dubbo 服务提供者配置

spring.dubbo.application.name=provider

spring.dubbo.registry.address=zookeeper://127.0.0.1:2181

spring.dubbo.protocol.name=dubbo

spring.dubbo.protocol.port=20880

spring.dubbo.scan=org.spring.springboot.dubbo

含义如下:

spring.dubbo.application.name应用名称

spring.dubbo.registry.address注册中心地址

spring.dubbo.protocol.name协议名称

spring.dubbo.protocol.port协议端口

spring.dubbo.scandubbo 服务类包目录

部分说明:

CityDubboServiceImpl.java 城市业务 Dubbo 服务层实现层类

@Service 注解标识为Dubbo 服务,并通过 version 指定了版本号。

 

1.9    Springboot-mybatis多个数据源项目

  业界流行的数据操作框架是 Mybatis.

Druid Java 的数据库连接池组件。Druid能够提供强大的监控和扩展功能。比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等。Druid核心主要包括三部分:

1. DruidDriver 代理 Driver,能够提供基于FilterChain 模式的插件体系。

2. DruidDataSource 高效可管理的数据库连接池

3. SQLParser

当业务数据量达到了一定程度,DBA 需要合理配置数据库资源。即配置主库的机器高配置,把核心高频的数据放在主库上;把次要的数据放在从库,低配置。开源节流嘛,就这个意思。把数据放在不同的数据库里,就需要通过不同的数据源进行操作数据。

1.9.1 数据库准备

restful项目,此外再创建一个数据库

CREATE DATABASE restfuldb_cluster;

创建表:

DROP TABLE IF EXISTS `city`;

CREATE TABLE user

(

idINT(10) unsigned PRIMARY KEY NOT NULL COMMENT '用户编号'AUTO_INCREMENT,

user_name VARCHAR(25) COMMENT '用户名称',

description VARCHAR(25) COMMENT '描述'

)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

插入数值:

INSERT user VALUES (1 ,'杭州','at杭州市cluster');

1.9.2 代码介绍

  项目结构如下图所示:

org.spring.springboot.config.ds - 配置层,这里是数据源的配置,包括 master cluster 的数据源配置

org.spring.springboot.controller -Controller

org.spring.springboot.dao - 数据操作层 DAO,细分了master cluster 包下的 DAO操作类

org.spring.springboot.domain - 实体类

org.spring.springboot.service - 业务逻辑层

Application - 应用启动类

application.properties - 应用配置文件,应用启动会自动读取配置

  在resources/mapper 下面有两个模块,分别是 Mybatis 不同数据源需要扫描的mapper xml 目录。

 

  多数据源配置的时候注意,必须要有一个主数据源,即MasterDataSourceConfig 配置:

@Primary 标志这个 Bean 如果在多个同类Bean 候选时,该 Bean 优先被考虑。「多数据源配置的时候注意,必须要有一个主数据源,用 @Primary 标志该 Bean」。

@MapperScan 扫描 Mapper 接口并容器管理,包路径精确到master,为了和下面 cluster 数据源做到精确区分。

@Value 获取全局配置文件 application.properties kv 配置,并自动装配sqlSessionFactoryRef 表示定义了 key ,表示一个唯一SqlSessionFactory 实例。

 

 

 

 

 

 

 

1.9.3 运行

 

在浏览器打开:http://localhost:8080/api/user?userName=杭州

{

    "id": 1,

    "userName": "杭州",

    "description": "at杭州市cluster",

    "city": {

        "id": 1,

        "provinceId": 1,

        "cityName": "杭州市",

        "description": "AT杭州。"

    }

}

  多数据源适合的场景很多。不同的 DataSource ,不同的 SqlSessionFactory 不同的 DAO 层,在业务逻辑层做整合。

1.10 Redis缓存

  在2C 端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。缓存就是一个存储器,在技术选型中,常用Redis 作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。Redis是一个高性能的 key-value 数据库。

  缓存更新的模式有四种:Cache aside, Readthrough, Write through, Write behind caching

 

 

1.10.1         Redis准备

  下载地址:http://www.redis.net.cn/download/

           解压,执行make,maketest,没有问题,就cd src

           执行redis-server启动redis.默认端口6379

 

1.10.2         运行项目

 

  根据 ID,获取城市信息

GET http://127.0.0.1:8080/api/city/1

  再请求一次,获取城市信息会发现数据获取的耗时快了很多。

  更新城市信息

PUT http://127.0.0.1:8080/api/city

  删除城市信息

DELETE http://127.0.0.1:8080/api/city/2

  这两种操作中,如果缓存有对应的数据,则删除缓存。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值