{{sellerTotalView > 1 ? __("sellers", {number: sellerTotalView}) : __("seller", {number: sellerTotalView}) }}, {{numTotalView > 1 ? __("items", {number: numTotalView}) : __("item", {number: numTotalView}) }}
free FREE

Change Your Zip Code

Inventory information and delivery speeds may vary for different locations.

Location History

{{email ? __('Got it!') : __('Restock Alert')}}

We will notify you by email when the item back in stock.

Cancel
Yami

Jingdong book

企业级Java EE架构设计精深实践

{{buttonTypePin == 3 ? __("Scan to view more PinGo") : __("Scan to start")}}

企业级Java EE架构设计精深实践

{{__(":people-members", {'people': item.limit_people_count})}} {{ itemCurrency }}{{ item.valid_price }} {{ itemCurrency }}{{ item.invalid_price }} {{ itemDiscount }}
Ends in
{{ itemCurrency }}{{ item.valid_price }}
{{ itemCurrency }}{{ priceFormat(item.valid_price / item.bundle_specification) }}/{{ item.unit }}
{{ itemDiscount }}
{{ itemCurrency }}{{ item.valid_price }} {{ itemCurrency }}{{ priceFormat(item.valid_price / item.bundle_specification) }}/{{ item.unit }} {{ itemCurrency }}{{ item.invalid_price }} {{itemDiscount}}
{{ itemCurrency }}{{ item.valid_price }}
Sale ends in
Sale will starts after Sale ends in
{{ getSeckillDesc(item.seckill_data) }}
{{ __( "Pay with Gift Card to get sale price: :itemCurrency:price", { 'itemCurrency' : itemCurrency, 'price' : (item.giftcard_price ? priceFormat(item.giftcard_price) : '0.00') } ) }} ({{ itemCurrency }}{{ priceFormat(item.giftcard_price / item.bundle_specification) }}/{{ item.unit }}) Details
Best before

Currently unavailable.

We don't know when or if this item will be back in stock.

Unavailable in your area.
Sold Out

Details

Full product details
Editer Recommend

“开源中国”知名博主“悠然”扛鼎大作!作者在开源中国开博两年,博客浏览量近百万次!

开源中国创始人红薯先生、特赞CTO黄勇先生、恒生电子CTO范径武先生倾情作序并推荐!

图书正式上市前一周作者博客预售,300多读者已经付款购买!

奉行“好的软件架构是‘品’出来的,好的软件架构一定是简单的”的原则写作!


本书是一本怎样的书?

1. 基于Java EE技术路线;

2. 面向企业级应用;

3. 以实践为主,每章解决一个具体问题,每章都提供开发案例;

4. 重点解决企业级架构中的问题及其解决方案;

5.可以保证书中的问题解决方案一定是相当不错的解。


特色鲜明,上乘之作!

1. 全面涵盖缓存、文件处理、模板语言、服务层、数据库架构、数据库水平扩展、元数据、Web架构、前端界面等企业级应用架构技术;

2. 提供大量的原创实践及原理性讲述,让读者对企业级Java EE架构有较为深入的理解;

3. 每章解决一个具体问题,采用“问题背景→需求分析→解决思路→架构设计→实践示例→章节总结”的顺序组织内容;

4. 注重内容的实用性和可操作性,每章都给出了实践性很强的开发案例。

Content Description

《企业级Java EE架构设计精深实践》全面、深入介绍了企业级Java EE设计的相关内容,内容涵盖了Java EE架构设计的常见问题。《企业级Java EE架构设计精深实践》每一章讲解一个Java EE领域的具体问题,采用问题背景、需求分析、解决思路、架构设计、实践示例和章节总结的顺序组织内容,旨在通过分析相关领域中的常用框架及存在问题,给出相应的解决方案,提高读者分析和解决问题的能力,并增强其架构设计的能力。

《企业级Java EE架构设计精深实践》共13章。内容主要包括虚拟文件系统实践、缓存实践、文件处理框架实践、模板语言实践、数据库访问层实践、数据库扩展实践、服务层实践、流程引擎实践、元数据实践、展现层开发实践、Web扩展实践、Tiny统一界面框架实践和RESTful实践。附录中给出了相关学习资源和配置运行指南。

《企业级Java EE架构设计精深实践》语言简洁,思路清晰,示例丰富、完整,适合具有一定Java基础的读者阅读,尤其适合从事企业级Java EE软件架构和设计的人员阅读。

快速了解本书13个技术专题:

虚拟文件系统实践

缓存实践

文件处理框架实践

模板语言实践

数据库访问层实践

数据库扩展实践

服务层实践

流程引擎实践

元数据实践

展现层开发实践

Web扩展实践

Tiny统一界面框架实践

RESTful实践



Author Description

罗果 专注于企业级Java EE开发平台领域。涉猎广泛,在模块化、元数据、模板引擎、数据库分区分表、SOA等领域都有深入实践。吃过很多亏,上过很多当,但坚信实践出真知。业余时间热心于开源技术,热衷于技术分享,撰写了大量的技术博客,从问题、原理和实践几个方面深入浅出地讲述知识。在“开源中国社区”开博两年,其博客浏览量已近百万次。所开发的Java EE开源框架Tiny,入驻“开源中国社区”两年以来,获得的Star和Fork数都已双双近千,是开源中国极具活力的开源项目之一。


Comments

这本书主要是通过对比各种流行的框架和技术来展示Tiny框架强悍又便利的优点。从前端模板展现、数据库访问、缓存,再到文件系统、服务分层、流程引擎、元数据和RESTful,同时还延伸到了系统扩展,可以说是面面俱到。 这本书在介绍Tiny框架的同时对与其对应的一些Java EE开源框架或技术也做了简单的讲解,同时包括对同类产品的分析。以悠然如此善于深入分析各类产品的技术来看,可知对这些问题领域的分析及其解决方案便是本书的精华所在,不得不推荐!

——开源中国创始人 红薯

Tiny框架的作者悠然是一位乐于分享的技术专家,他在“开源中国社区”上分享了大量的技术文章。现在Tiny团队将他们几年的研究成果成书,并毫无保留地分享给各位技术爱好者。我也非常荣幸地提前看到了全书内容,相信本书一定会让您在架构和设计方面有所收获。

——特赞(tezign.com)CTO 黄勇

本书得益于作者的深厚功底及勇敢实践,并以企业应用中遇到的十多个真实应用场景作为主题进行架构实践,对这些主题按问题概述、分析问题、解决问题的过程进行了有益探索。书中的问题解决方案可以保证是相当不错的解,应该说都体现了作者在这方面所做的努力。

——恒生电子执行总裁/CTO 范径武

Catalogue

第1章 虚拟文件系统实践

1.1 背景介绍

1.2 什么是VFS

1.3 VFS对比

1.3.1 Apache VFS

1.3.2 Tiny VFS

1.4 VFS框架设计思想

1.5 VFS实现讲解

1.5.1 VFS管理器

1.5.2 SchemaProvider模式提供者

1.5.3 FileObject虚拟文件

1.5.4 FileObjectFilter过滤接口

1.6 VFS应用示例

1.6.1 本地文件

1.6.2 Jar文件

1.6.3 FTP文件

1.6.4 ZIP文件

1.7 本章总结

第2章 缓存实践

2.1 缓存简介

2.1.1 问题的提出及其解决方案分析

2.1.2 用户需求

2.1.3 Tiny缓存解决思路

2.2 字节码缓存设计

2.2.1 字节码操作工程

2.2.2 预编译工程

2.2.3 缓存实现工程

2.2.4 技术特点

2.3 动态代理缓存设计

2.3.1 缓存接口定义

2.3.2 切面缓存工程

2.3.3 技术特点

2.4 缓存方案实践

2.4.1 字节码方案配置

2.4.2 字节码方案示例

2.4.3 动态代理方案配置

2.4.4 动态代理方案示例

2.5 本章总结

2.5.1 关键点:缓存实现方案的可替换性

2.5.2 关键点:缓存代码与业务代码的解耦

2.5.3 关键点:模板语言的应用

第3章 文件处理框架实践

3.1 概述

3.1.1 FileProcessor接口

3.1.2 FileResolver接口

3.1.3 FileMonitorProcessor类

3.2 基础文件扫描器

3.2.1 XStreamFileProcessor类

3.2.2 I18nFileProcessor类

3.2.3 Annotation扫描器

3.2.4 SpringBeansFileProcessor类

3.3 完整示例

3.3.1 单独使用

3.3.2 通过配置文件配置

3.4 本章总结

第4章 模板语言实践

4.1 模板语言简介

4.1.1 模板语言构成

4.1.2 模板语言应用场景

4.2 常见的模板语言

4.2.1 Velocity模板语言

4.2.2 FreeMarker模板语言

4.2.3 Tiny模板语言

4.3 Tiny模板语言设计

4.3.1 Tiny模板语言的构建原因

4.3.2 模板语言执行方式

4.3.3 模板语言架构

4.3.4 Tiny模板语言实现与扩展

4.3.5 模板语言语法解析

4.3.6 模板语言渲染机制

4.4 模板语言的使用

4.4.1 依赖配置

4.4.2 模板语言的配置

4.4.3 模板语言的Eclipse插件

4.4.4 Hello,TinyTemplate

4.5 模板语言语法介绍

4.5.1 变量

4.5.2 取值表达式

4.5.3 Map常量

4.5.4 数组常量

4.5.5 其他表达式

4.5.6 索引表达式

4.5.7 #set指令

4.5.8 条件判断

4.5.9 ==相等运算

4.5.10 AND运算

4.5.11 OR运算

4.5.12 NOT运算

4.5.13 循环语句

4.5.14 循环状态变量

4.5.15 循环中断:#break

4.5.16 循环继续:# continue

4.5.17 while循环

4.5.18 模板嵌套语句#include

4.5.19 宏定义语句#macro

4.5.20 宏引入语句#import

4.5.21 布局重写语句#layout #@layout

4.5.22 停止执行#stop

4.5.23 返回指令#return

4.5.24 行结束指令

4.5.25 读取文本资源函数read和readContent

4.5.26 解析模板parser

4.5.27 格式化函数fmt、format和formatter

4.5.28 宏调用方法call和callMacro

4.5.29 实例判断函数is、instanceOf和instance

4.5.30 求值函数eval和evaluate

4.5.31 随机数函数rand和random

4.5.32 类型转换函数

4.5.33 日期格式转换formatDate

4.6 模板语言扩展

4.6.1 资源加载器的使用

4.6.2 宏的使用

4.6.3 函数的使用

4.6.4 国际化的使用

4.6.5 静态类和静态方法的使用

4.6.6 Servlet集成

4.6.7 SpringMVC集成

4.7 本章总结

第5章 数据库访问层实践

5.1 数据访问层简介

5.2 常见数据库访问层介绍

5.2.1 Hibernate简介

5.2.2 Ibatis简介

5.2.3 JPA简介

5.2.4 DSL数据库访问层简介

5.3 TinyDsl设计方案

5.3.1 SQL抽象化设计

5.3.2 DSL风格SQL设计

5.3.3 SQL执行接口设计

5.3.4 执行接口实现介绍

5.4 数据库访问层示例

5.4.1 工程创建

5.4.2 准备工作

5.4.3 Hibernate示例

5.4.4 Ibatis示例

5.4.5 JPA示例

5.4.6 TinyDsl示例

5.5 本章总结

第6章 数据库扩展实践

6.1 数据库扩展简介

6.2 常见数据库扩展方案

6.2.1 DAO层

6.2.2 DataSource层

6.2.3 JDBC层

6.2.4 Proxy层

6.3 读写分离

6.3.1 读写分离

6.3.2 负载均衡

6.3.3 数据同步

6.4 分库分表

6.4.1 同库分表

6.4.2 不同库分表

6.5 开源方案介绍

6.5.1 TDDL

6.5.2 Routing4DB

6.5.3 TinyDbRouter

6.5.4 开源方案的对比

6.6 TinyDbRouter的设计和实现

6.6.1 设计目标

6.6.2 设计原理之接入层设计

6.6.3 设计原理之SQL解析层设计

6.6.4 设计原理之路由决策层设计

6.6.5 设计原理之执行层设计

6.6.6 实现

6.7 应用实践

6.7.1 读写分离示例

6.7.2 分库分表示例

6.7.3 集群事务示例

6.7.4 元数据示例

6.7.5 自定义扩展

6.7.6 常见FAQ

6.8 本章总结

第7章 服务层实践

7.1 服务层简介

7.1.1 传统服务层

7.1.2 Tiny服务层

7.2 Tiny服务层介绍

7.2.1 服务声明

7.2.2 服务注册

7.2.3 小结

7.3 本地服务层实践

7.3.1 服务描述

7.3.2 服务定义

7.3.3 服务收集与注册

7.3.4 服务执行

7.3.5 小结

7.4 远程服务实践

7.4.1 传统的远程服务

7.4.2 新的远程服务模式

7.4.3 多服务中心支持

7.4.4 新的远程服务实现

7.4.5 小结

7.5 本地服务调用示例

7.5.1 非Tiny框架调用示例

7.5.2 Tiny框架应用调用

7.6 远程服务配置示例

7.6.1 非Tiny框架配置示例

7.6.2 Tiny框架应用配置

7.7 本章总结

第8章 流程引擎实践

8.1 流程引擎简介

8.1.1 流程引擎的来历

8.1.2 解决方案

8.1.3 特性简介

8.2 流程引擎实现

8.2.1 流程组件

8.2.2 流程组件配置

8.2.3 流程组件管理

8.2.4 流程配置

8.2.5 流程管理

8.2.6 流程执行

8.3 流程引擎特性

8.3.1 流程可继承性

8.3.2 灵活的EL表达式

8.3.3 流程可重入

8.3.4 流程可转出

8.3.5 强大异常处理

8.4 流程编辑器

8.4.1 创建流程

8.4.2 界面说明

8.4.3 操作说明

8.5 本章总结

第9章 元数据实践

9.1 元数据简介

9.1.1 问题背景

9.1.2 解决途径

9.2 基础元数据设计

9.2.1 支持语言类型

9.2.2 标准数据类型

9.2.3 业务数据类型

9.2.4 标准字段

9.3 数据库元数据设计

9.3.1 表及索引

9.3.2 视图

9.4 元数据开发指南

9.4.1 元数据加载机制

9.4.2 元数据处理器

9.5 元数据开发实践

9.5.1 Eclipse插件

9.5.2 应用配置

9.5.3 生成方言模板

9.5.4 生成标准数据类型

9.5.5 生成业务数据类型

9.5.6 生成标准字段

9.5.7 生成数据库表

9.5.8 定义元数据

9.5.9 生成Java代码

9.5.10 生成SQL

9.6 本章总结

第10章 展现层开发实践

10.1 展示层简介

10.1.1 Servlet

10.1.2 JSP

10.1.3 模板语言

10.1.4 展示层常见问题

10.2 展示层方案设计

10.2.1 UI组件包开发

10.2.2 资源合并实践

10.2.3 避免重复代码

10.2.4 国际化问题

10.3 前端访问方案实践

10.3.1 组件包封装

10.3.2 宏接口定义

10.3.3 页面和布局编写

10.3.4 前端参数配置

10.4 本章总结

10.4.1 关键点:DRY原则的实现

10.4.2 关键点:JS文件的合并

10.4.3 关键点:CSS文件的合并

第11章 Web扩展实践

11.1 背景简介

11.2 监听器设计原理

11.2.1 应用配置管理

11.2.2 应用处理器(ApplicationProcessor)

11.2.3 Web监听器

11.2.4 监听器配置管理

11.3 过滤器设计原理

11.3.1 请求上下文(WebContext)

11.3.2 TinyFilter介绍

11.4 处理器设计原理

11.4.1 过滤器配置(TinyProcessorConfig)

11.4.2 过滤器配置管理(TinyProcessorConfigManager)

11.4.3 处理器管理接口(TinyProcessorManager)

11.5 BasicTinyFilter类

11.5.1 拦截器接口

11.5.2 默认拦截器

11.6 SetLocaleTinyFilter类

11.6.1 Locale基础

11.6.2 Charset编码基础

11.6.3 Locale和charset的关系

11.6.4 设置locale和charset

11.6.5 使用方法

11.7 ParserTinyFilter类

11.7.1 基本使用方法

11.7.2 上传文件

11.7.3 高级选项

11.8 BufferedTinyFilter类

11.8.1 实现原理

11.8.2 使用方法

11.8.3 关闭buffer机制

11.9 LazyCommitTinyFilter类

11.9.1 什么是提交

11.9.2 实现原理

11.9.3 使用方法

11.10 RewriteTinyFilter类

11.10.1 概述

11.10.2 取得路径

11.10.3 匹配rules

11.10.4 匹配conditions

11.10.5 替换路径

11.10.6 替换参数

11.10.7 后续操作

11.10.8 重定向

11.10.9 自定义处理器

11.11 SessionTinyFilter类

11.11.1 概述

11.11.2 Session框架

11.11.3 Cookie Store

11.11.4 总结

11.12 SpringMVCTinyProcessor介绍

11.12.1 基于扩展协议的内容协商

11.12.2 约定开发

11.12.3 扩展协议

11.13 TinyWeb实践

11.13.1 准备工作

11.13.2 使用TinyHttpFilter

11.13.3 使用TinyProcessor

11.14 本章总结

第12章 Tiny统一界面框架实践

12.1 UIML简介

12.2 UIML开发指南

12.3 UIML使用实践

12.4 常见FAQ

12.5 本章总结

第13章 RESTful实践

13.1 RESTful简介

13.2 Spring RESTful实践

13.3 Tiny RESTful风格实践

13.4 Tiny RESTful实践

13.5 本章总结

附录A 相关资源

附录B 配置运行指南

Book Abstract

第1章 虚拟文件系统实践

VFS(Virtual File System),虚拟文件系统。那么什么是现实的文件系统,什么又是虚拟的文件系统呢?举个例子,我们的硬盘有C盘、D盘等,其下又有各种文件夹以及文件,那么我们认为它就是现实的文件系统;而虚拟文件系统呢,它是根据现实的文件系统,在内存中构建的一套虚拟系统,目的是方便我们程序操作现实的文件系统。可以说它(VFS)是我们对现实文件系统的一种抽象。

1.1 背 景 介 绍

一开始我们是没有做一个VFS的想法的,出于对Apache的绝对信任,我们选择了Apache VFS 2.0来作为Tiny框架的VFS解决方案。确实,它的API是统一的、优雅的,支持的协议种类也比较多,在简单评估之后,觉得就用它吧,总不能什么轮子都自己造。

于是Apache VFS就被依赖到框架,功能也完全良好。但是在压力测试的时候,却发现有内存泄露问题,DUMP一下内存,进行分析之后发现原来是Apache VFS 2.0惹的祸,看一看Apache VFS已经好久没有升级了,通过跟踪源码,发现有些地方比较诡异,有时候进入有时候不进入,查之良久而不得。想自己修改吧,代码结构太过复杂,尝试了几次没有成功,只好下决定把Apache VFS从里面拿掉,而拿掉之后,就需要实现类似的功能,不得已才决定自己写一个VFS。

1.2 什么是VFS

VFS(Virtual File System)的作用就是按照提供统一文件处理接口来访问不同来源的不同文件,即为各类文件系统提供了一个统一的操作界面和应用编程接口。VFS是一个可以使文件访问不用关心底层的存储方式及来源类型就可以工作的中间层。

一般来说,VFS框架都会设计一个FileObject(或类似)接口。它代表一个文件对 象,和Java的File类不同,它具有更多延伸的功能和信息,可以用来定义任何来源的文件对象。每个FileObject对象代表一个逻辑文件,能够被用来访问逻辑文件的内容和位置等信息。

1.3 VFS对比

Apache VFS是一款比较优秀的开源框架,提供了非常全面的功能支持;而Tiny VFS 则实现了几个主要的功能,同时提供了一套自定义扩展方案,接口清晰简洁。下面我们从功能点、代码量等方面对两者来做个对比。

1.3.1 Apache VFS

Apache VFS提供了一种虚拟文件系统,能够让你通过程序很方便地和本地文件、FTP文件及HTTP文件打交道。

从图1-1可以看出,真正的Java代码有21915行,如果包含注释就是40914行,代码规模还是非常大的。

图1 1 代码行1

1.3.2 Tiny VFS

Tiny的VFS框架,虽然支持的Schema较Apache VFS 稍少,但是主要功能都已实现,用户也可以根据需要自行扩展其他的模式提供者。

支持的Schema:

JarSchemaProvider,注册本地jar模式提供者;

WsJarSchemaProvider,注册wsjar协议的模式提供者;

ZipSchemaProvider,注册本地zip模式提供者;

FileSchemaProvider,注册file协议的模式提供者;

HttpSchemaProvider,注册http协议的模式提供者;

HttpsSchemaProvider,注册https协议的模式提供者;

JBossVfsSchemaProvider,注册vfs虚拟协议的模式提供者;

FtpSchemaProvider,注册ftp协议的模式提供者。

从图1-2可以看出,Java代码只有1523行,包含注释也不过2505行,代码结构更清晰、简洁,可维护性更强。

图1 2 代码行2

1.4 VFS框架设计思想

前面介绍了虚拟文件系统(VFS)的基础定义,以及Apache VFS和Tiny VFS。计算机技术发展的早期阶段,还没有网络概念,文件存储只能在本地。后来随着局域网和互联网的出现,程序员可以通过网络协议远程访问文件;而现在云存储的兴起,使得文件的操作更加简单:程序员甚至不用关心文件的真实物理位置,通过虚拟的云地址就可以完成 所有操作。如果针对不同的文件来源就要在程序中编写相应的处理代码,势必会导致开 发成本上升,维护升级困难,因此虚拟文件系统(VFS)的出现是计算机技术发展的必然结果。

VFS框架的出现,有如下几点优点:

统一文件资源的访问方式,简化应用资源的开发。程序员不用关心文件是本地文件、FTP远端文件还是第三方运营商提供的云存储文件。

屏蔽应用层通信协议和底层文件格式的差异,甚至隐藏不同客户端的代码差异。

采用接口方式定义VFS,也方便以后对新协议的扩展,符合软件开发的开闭原则。

对一个虚拟文件系统而言,最基础的概念有三点:VFS管理器、SchemaProvider模式提供者和FileObject虚拟文件访问接口。三者关系如图1-3所示。

图1 3 VFS框架设计图

程序员可以通过VFS管理器获取指定路径的FileObject对象,但是实际上VFS自己不做具体的事情,它委托注册在VFS中的模式提供者做实际的解析,并将解析到的结果,也就是虚拟文件对象返回给调用者。

VFS管理器类似于总包,模式提供者相当于分包,FileObject对象就是最终结果。总包(VFS管理器)本身不做任何具体工作,它负责管理和对外对接,所有的具体工作都是分配给自己的分包(模式提供者)完成。接到一个任务,它会依次询问每个模式提供者是不是其职能范围:如果是,则委派这个分包完成工作任务;不是的话,就问下一个模式提供者;万一问到最后也没有模式提供者能完成的话,VFS管理器就会使用默认的模式提供者去完成工作任务。

开发者可以通过扩展并把扩展的新的模式提供者注册到VFS管理器,然后就可以通过VFS管理器解析特定来源的文件了。

1.5 VFS实现讲解

这里列举了几个重要的接口,来说明VFS的实现原理。

1.5.1 VFS管理器

VFS管理器是作为工具类提供的,因此采用静态工具类的方式进行展示。核心方法如表1-1所示。

表1 1 VFS方法说明

方 法 名 方 法 说 明

addSchemaProvider 增加新的模式提供者

getSchemaProvider 根据模式名称获取对应的模式提供者

setDefaultSchemaProvider 设置默认的模式提供者

resolveFile 根据String类型的协议地址解析FileObject

resolveURL 根据URL类型的协议地址解析FileObject


为了便于开发人员使用,VFS管理器内置了一些模式提供者,以支持常见的文件来源协议,如下:


static {

addSchemaProvider(new JarSchemaProvider());//注册本地jar模式提供者

addSchemaProvider(new WsJarSchemaProvider());//注册wsjar协议的模式 提供者

addSchemaProvider(new ZipSchemaProvider());//注册本地zip模式提供者

addSchemaProvider(new FileSchemaProvider());//注册file协议的模式提供者

addSchemaProvider(new HttpSchemaProvider());//注册http协议的模式提供者

addSchemaProvider(new HttpsSchemaProvider());//注册https协议的模式 提供者

addSchemaProvider(new FtpSchemaProvider());//注册ftp协议的模式提供者

addSchemaProvider(new JBossVfsSchemaProvider());

//注册其他vfs虚拟协议的模式提供者


}


通过addSchemaProvider方法,开发人员可以给VFS管理器增加新的模式提供者,从而扩展对新的URL协议或者格式的处理能力。

VFS管理器解析URL过程如下:

(1)根据资源路径path从缓存容器fileObjectCacheMap查询是否存在已经被解析的FileObject对象,如果存在,则进一步判断该对象是不是包资源和最近的修改时间戳,如果是没有被修改的包资源(FileObject对象)就直接返回,否则继续下一步。

(2)对资源路径resource进行转码。

(3)设置schemaProvider变量为默认的SchemaProvider模式提供者。

(4)遍历schemaProviderMap容器,判断模式提供者是否能处理资源路径resource,如果能处理,则设置schemaProvider变量为当前的模式提供者,并中断循环。

(5)调用schemaProvider的resolver接口,获得FileObject对象。

(6)判断FileObject对象是不是包资源,如果是则放入缓存容器,并记录修改的时 间戳。

(7)返回解析结果。

resolveFile代码示例如下:


public static FileObject resolveFile(String resourceResolve) {

String resource=resourceResolve;

//根据协议地址从缓存中查询FileObject

FileObject fileObject = fileObjectCacheMap.get(resource);

if (fileObject != null && fileObject.isInPackage()) {

//检查FileObject的最近修改时间戳和缓存中的是否一致,如果一致的话就直接返回 结果

long oldTime = fileModifyTimeMap.get(resource);

long newTime = fileObject.getLastModifiedTime();

if (oldTime == newTime) {

return fileObject;

}

}

//取得默认的模式提供者FileSchemaProvider

SchemaProvider schemaProvider = schemaProviderMap.get(defaultSchema);

for (SchemaProvider provider : schemaProviderMap.values()) {

//遍历模式提供者,判断协议地址是否匹配当前模式提供者

if (provider.isMatch(resource)) {

schemaProvider = provider;

break;

}

}

//返回解析结果

fileObject = schemaProvider.resolver(resource);

//如果fileObject是包资源,则更新fileObject缓存和时间戳信息

if (fileObject != null && fileObject.isInPackage()) {

fileObjectCacheMap.put(resource, fileObject);

fileModifyTimeMap.put(resource, fileObject.getLastModifiedTime());

}

return fileObject;

}


从解析效率和优化性能的角度出发,VFS管理器在解析匹配虚拟文件时使用了缓存 机制:会优先根据路径从缓存中获取资源,避免重复解析资源。如果是包资源(如jar 包、zip包),只要资源没有被修改,也只会被解析一次,从而提升整体性能,提升查找 速度。

1.5.2 SchemaProvider模式提供者

模式提供者是虚拟文件解析的执行者,由VFS管理器调度。如果需要解析新的模式,只需要实现对应的SchemaProvider接口,并注册到VFS管理器即可,接口方法说明如表1-2所示。

表1 2 SchemaProvider方法说明

方 法 名 方 法 说 明

getSchema 返回处理的模式

isMatch 是否匹配。如果返回true,则表示此提供者可以处理;返回false表示不能处理

resolver 解析资源,并返回文件对象


Introduction

序一

我不明白为什么相比于其他的编程语言,Java的世界充满了各种框架和架构。可能是因为Java太过于灵活,也可能是因为官方对Java EE规范所提供的 API 都是非常底层的东西,很少牵扯到具体的业务需求。虽然这样可以在一定程度上保证规范本身的兼容性和适应性,但也因此导致了用Java开发一些具体业务应用时显得过于烦琐,不够轻便和快捷。于是出现了Struts等开源框架,再就是后来Javaer们耳熟能详的SSH三大框架,直至今天琳琅满目的各种开发框架。所有的这些框架,其唯一的目的就是简化业务逻辑的开发,其手法无不是利用各种各样的设计模式对 API 的各种层次进行封装。

我曾经发文公开反对初学者在对 Java 知之甚少的情况下学习各种框架。主要原因有两点:一是知其然而不知其所以然;二是更换框架后学习成本很高。因为先入为主的 思想作怪,当本书作者(我们姑且就叫他的网名“悠然”吧)第一次将他的Tiny框架提交到“开源中国”的时候,我并没有过多的关注。哦,仅仅是又一个新的Java EE框架 而已。

Tiny 再次进入我的视线是在“开源中国”社区围绕该项目越来越多的关注和讨论,而且不断出现在我们的各种开源项目榜单中。另外,Tiny开源框架不同于其他开源框架的突出特点是代码提交非常活跃。可以毫不夸张地说是“开源中国”GIT库中Commits提交最多的开源者。当然还有另外一个非常重要的原因是悠然写了一篇非常专业的“喷文”,该文章非常专业地指出我本人的一个开源项目J2Cache中存在的各种设计的不足,专业到让我无言以对,甚至颇有“挑衅”的意味。如此专业的设计思路及对代码近乎完美的追求,让我相信Tiny必然也会是在这种要求下的产物。此外,其团队利用该框架快速开发的几个应用类项目,也证明了其在开发效率上的提升是非常显著的。

这本书主要是通过对比各种流行的框架和技术来展示Tiny框架强悍又便利的优点。从前端模板展现、数据库访问、缓存,再到文件系统、服务分层、流程引擎、元数据和RESTful,同时还延伸到了系统扩展,可以说是面面俱到。基本上你在开发Java EE应用时涉及的绝大多数技术层面上的内容,本书都会详尽讲述。

前面我说过反对初学者一开始从框架入手进行学习。这本书在介绍Tiny框架的同时,对与其对应的一些Java EE开源框架或技术也做了简单的讲解,同时包括对同类产品的分析。以悠然如此善于深入分析各类产品的技术来看,可知对这些问题领域的分析及其解决方案便是本书的精华所在,不得不推荐!

最后我想提一下:没有最好的框架,只有最适合自己的框架。当你面对数百个Java框架一脸茫然的时候,考虑一下这么几个要素:是否打心眼里喜欢?是否足够简单和轻便,而不是充斥一堆你根本用不上的特性?项目本身在社区上是否足够活跃?作者本人长得帅不帅(开个玩笑)……如果上面所有的答案都是否定的,那就自己造一个吧!


开源中国创始人 红薯


序二

十年前,我上大学的时候,就听说Java这门计算机语言已经很流行了。Java分为J2SE、J2EE和J2ME这三大平台,分别对应桌面、Web和移动这三大领域。当时我为了找到一份高薪工作,放弃了自己所擅长的C++,也学着别人开始学习Java,尤其是学习当时市场需求量最大的J2EE技术。我学了JSP、Servlet和EJB这几种J2EE核心技术,也学了经典的MVC框架Struts和最流行的ORM框架Hibernate。想当年,我可以熟练地使用JSP+Struts+Hibernate开发一个小型Java Web应用程序,轻松地应对毕业设计,自己也可以接点私活赚点外快。但对于大型企业级应用而言,首选技术还是EJB。所谓企业级就是一个既安全又复杂的技术,因为它需要考虑到多方面的问题,所以会带来一系列的复杂问题。但凡用过EJB的人,都会感受到那是一场痛苦的经历。而Spring的到来,改变了这一切,给企业级J2EE带来了“春天”,Spring+Struts+Hibernate三个框架组合也被广泛地应用于Web开发,并且大家称其为SSH组合。

十年后,Java还能位居编程语言排行榜首,我真的庆幸自己当年的选择是正确的。以前的J2EE,现已改名为Java EE,也许这样的命名会更加有意义。而以前的SSH,却显得有些重量级了。也许是因为它们自身的特性越来越多,或者是因为轻量级的框架越来越多,例如我开源的Smart框架,就是一款轻量级的Java Web框架,为了讲明白该框架的开发过程,我也写过一本叫做《架构探险》的书(一不小心就为自己做了一个广告,还是言归正传吧)。很多大型企业级应用会放弃掉一些技术,例如Struts、Hibernate和JSP等,但Spring目前仍然还是主流,尤其是Spring MVC,足以取代Struts。此外,轻量级JDBC框架MyBatis(以前叫做iBatis)也可以取代Hibernate,所以现在企业级Java EE架构的首选变成了Spring+Spring MVC+MyBatis,简称SSM。

不管是SSH还是SSM,都只是开发框架而已,并非技术解决方案。大家知道,企业级应用是一个相当复杂的应用系统,需要的不仅仅是一个开发框架,更是一系列的技术解决方案。这些解决方案包括虚拟文件系统、缓存、文件处理框架、模板语言、数据库访问层、数据库水平扩展、服务层、流程引擎、元数据、展现层、Web层、统一界面框架、RESTful和模块化等,这些才是企业级应用的核心需求。Tiny框架将这些需求迎刃而解,代码完 全开源,并且在国内有良好的技术社区网站(tinygroup.org)。更重要的是,Tiny框架的作者是一位乐于分享的技术专家,在开源中国网站(oschina.net)上分享了大量的技术 文章。现在Tiny团队将他们几年的研究成果汇集成书,并毫无保留地分享给各位技术爱 好者。我也非常荣幸地提前看到了全书内容,相信本书一定会让您在架构和设计方面有所收获。

使用Tiny,可以让开发者从复杂的技术细节跳出来,而将精力集中到业务上,从而节省很多时间。热爱研究技术的朋友们也可以通过阅读本书获取技能上的提升,成为一名优秀的架构师。

祝愿Tiny的将来会越来越好!开源改变生活,开源改变世界


特赞(tezign.com)CTO 黄勇

2016年1月31日于上海


序三

最近《三体》非常火,书中说到了三体文明将质子做维护展开的情形,甚至展开的质子可以覆盖整个星球。

其实在软件应用实践过程中,也存在多种不同层次的维度。例如,从用户角度来看,主要是人机交互上的一些感观;从业务角度来看,主要是各种不同的业务功能;从架构角度来看,软件又分属于不同的独立的体系,这些体系的相互作用最终构成了整个软件;从机器执行过程来看,又都是一些0101的二进制代码流或数据流……

如果直接使用基础开发语言和一些基础类库来进行开发,当软件比较小的时候没有任何问题。但是作为一个企业级应用来说,如果还是采用同样的模式,那么后果将会是不堪设想的。我见过许多业务上非常成功,但是由于没有良好的架构支撑而已经崩溃或走向崩溃的系统。真正优秀和成功的软件产品,必须有一个良好的架构支撑,才可以实现持续的发展和进步。

本书得益于作者的深厚功底及勇敢实践,并以企业应用中遇到的十多个真实应用场景作为主题进行架构实践,对这些主题按问题概述、分析问题和解决问题的过程进行了有益探索。虽然不能说所有的解决方案一定都是最优的,但是应该说都体现了作者在这方面所做的努力。“一花独放不是春,万紫千红春满园。”,也欢迎有更多、更好的企业级架构方面的实践书籍涌现出来,促进企业级Java EE应用的发展。


恒生电子股份有限公司执行总裁/CTO 范径武

2016年1月25日于杭州


前 言

从本书的书名《企业级Java EE架构设计精深实践》可以看到几个关键词:企业级、Java EE、架构和实践。简单地说,本书是一本基于Java EE技术路线,面向企业级应用,解决企业级应用架构问题,并以实践为主的书籍。

目前市场上已经有了许多Java EE领域的书籍,涵盖了Java EE规范、Java EE的各种流行前后台框架等。这些书籍有一些写得非常好,比较全面地覆盖了企业级Java EE应用的方方面面。因此本书不会讲解Java相关的基础知识,不会讲解Java EE规范方面的知识,也不会花大量篇幅介绍流行框架的使用及技巧,而是把重点放在需要解决的一些企业级应用中的问题及其解决方案和实践过程,让读者跟随笔者的思路一起实践。笔者不能保证书中所有的实践都是最优解,但一定是相当不错的解。

企业级应用是本书内容的核心,那么什么是企业级应用呢?这个问题本身就没有标准答案。但是企业级应用涉及的一些领域还是可以列举的。

数据持久化:这里的数据泛指结构化和非结构化数据。这些数据从产生到消亡有着漫长的创建、更新、查询和删除的生命周期,有的数据甚至要存在许多年。这些数据需要为避免丢失而进行存储操作,为高效利用而进行缓存加载操作,再加上数据自身的CRUD等操作,在上述过程中就需要解决各种各样的问题。

海量并发访问:对于小的应用系统,访问者可能就是一个或几个人,稍大点的系统访问者有上百人。但是对于企业级应用尤其是互联网级应用来说,其注册用户、在线用户和并发请求都是巨大的。应用请求数较少和应用请求数巨大的架构模式是有巨大差异的,由此也会引入许多的架构问题。

海量数据:对于企业级应用来说,百万级数据只不过是起步,千万甚至数十亿条数据都是常见的。在数据规模比较小的时候不存在问题,而在数据规模比较大的时候就会出现严重的性能问题。为了保证在海量应用的情景下也可以使用,这时原有的数据架构就需要进行重构。

应用规模庞大:应用的规模越大,开发、测试、集成和维护起来就越困难。笔者就亲眼见到过一个项目,业务方面是非常出色的,但是随着产品的规模越来越大,而项目的开发方式无法适应,导致整个项目无法继续进行,以失败而告终。所以如何让应用随着规模的变大,其开发、测试、集成和维护成本只是出现等比例增长,而不是随着应用规模的变大产生指数级增长,这就变得非常重要了。

界面需求复杂:随着应用规模的变大,企业级应用的界面也越来越多。而在企业级应用中,又需要对使用权限、界面一致性和界面的易集成性等有非常高的要求。所以在企业级应用中,界面层有一个良好解决方案是非常有挑战性的。

与第三方系统协作:与小的应用不同,企业级应用的生成周期比较长,一个企业当中又有多个不同方面的系统同时存在,这些系统之间往往需要有数据或服务协作。但是由于不同的应用可能是来自于不同厂商采用不同开发语言和不同数据库开发的,所以这就对它们协同运作产生了许多问题。

总之,企业级应用可以理解成业务复杂、规模巨大、数据种类多、数据量大、访问请求大、生命周期长和并发请求巨大的应用。正是由于上述特点而产生了许许多多的问题,而这些问题的解决方案往往是有冲突的,因此如何艺术性地解决这些问题就往往需要从架构上想办法。

本书重点介绍的Tiny框架是Tiny开源小组历经5年业余时间,孜孜不倦地投入与坚持的产物。它是通过团队艰苦卓绝的努力所构建的体系完整、内容庞大的企业级开源框架。笔者和Tiny团队在解决这些问题时做了大量的尝试和实践,在诸多领域都有非常专业的解决方案,我们非常愿意通过本书与读者分享。

本书特色

1.基于原创,开拓思路

本书有大量的原创实践及原理性讲述,不管读者用不用本书中的框架,都可以对企业级Java EE架构中的一些技术及其解决方案有较为深入的理解,这对于读者开拓思路,避免踩同样的“坑”有非常强的借鉴作用。

2.涵盖广泛,讲解深入

本书介绍的内容都是当前主流框架和优秀技术,涵盖缓存、文件处理、模板语言、服务层、数据库架构、数据库水平扩展、元数据、Web架构和前端界面等Java EE领域经常用到的知识,涉及企业级应用架构开发的方方面面。对这些内容的讲解不是泛泛而谈,而是有相当的深度。

3.内容实用,注重实践

本书内容非常注重知识的实用性和可操作性,这些内容都是作者多年以来构建Java EE开发框架实践过程中的宝贵经验汇集而成的。本书每章都给出了实践性很强的开发案例供读者理解。

4.思路清晰,文笔简练

本书每章按照问题背景、需求分析、解决思路、架构设计、实践示例和章节总结的顺序行文,丝丝入扣,符合人们的认知规律。而且本书行文风格朴实,文笔简练,知识的讲解由浅入深、循序渐进,即便是初学者,只要肯用心也会有所收获。

5.与众不同,切中要害

本书有相当多的实践具有“反模式”的特质,也就是说与常见的解法不一样,再辅之以简单的示例,可以让读者非常容易理解其设计精要,有醍醐灌顶之感觉。

6.理论与实践齐抓,局部与整体并重

本书注重问题的解决思路和开发细节,既介绍了企业级Java EE架构的设计思想,也兼顾了应用的具体实践,避免了学习过程中理论与实践的脱节,连贯而统一。本书每章都有独立的测试用例,最后还提供了完整的Web开发案例,这样通过先局部后整体的方式,可以让读者更好地理解Java EE开发架构。

7.编排科学,适用面广

本书内容编排既可以让初学者对Java EE架构有整体的认知,也可以让那些学有余力、经验丰富的开发人员深入钻研自己感兴趣的内容。无论是哪个层次的读者,阅读完本书后都会有所收获,甚至对以前自己觉得深不可测的问题有豁然开朗的感觉。

本书内容

本书正文共13章,采用问题背景、需求分析、解决思路、架构设计、实践示例和章节总结的顺序来组织内容。下面简单介绍一下每章的内容。

第1章 虚拟文件系统实践

本章从Apache VFS框架存在的内存泄露Bug说起,引入企业级应用常见的虚拟文件系统的概念,并介绍了Apache VFS框架和Tiny VFS框架。另外,还讲解了VFS的设计思想,介绍了VFS管理器、虚拟文件接口和模式提供者等概念,并给出本地文件、JAR和FTP的实践用例。

第2章 缓存实践

本章以Java EE应用遇到的性能问题作为话题,引导读者了解缓存技术的重要性。在讲解一个实际项目缓存的代码变迁过程中,自然而然地列举了对现有缓存方案的改进:业务代码与缓存框架分离;具体缓存实现的切换不影响业务开发;支持XML配置等。本章介绍了两种缓存架构:字节码缓存方案和动态代理缓存方案,并对比了两者的优缺点。希望读者通过阅读本章内容,能够对开发企业级应用有新的心得体会。

第3章 文件处理框架实践

本章介绍了文件处理框架,可以有效地解决Java EE应用模块化导致的各种配置文件分散在不同模块而带来的处理这些资源难度大的问题。在介绍Tiny文件处理框架的过程中,请仔细阅读文件扫描器接口、文件扫描器主入口和定时扫描器的介绍,理解框架如何把文件的扫描、文件的变化、文件的遍历等与文件的实际处理分离,体会“开-闭”原则的具体运用。

第4章 模板语言实践

本章介绍了模板语言及其在Java EE领域的实践开发。为了便于读者理解,笔者先介绍模板语言的概念、原理和应用场景,并列举了常见的模板语言Velocity、FreeMarker和Tiny,比较了三者的优势和不足。特别是在设计开发的章节,按模板语言的架构、语法解析和渲染机制的顺序,从零开始讲解如何构建一种模板语言。通过对本章内容的学习,有能力的读者完全可以尝试扩展模板语言。

第5章 数据库访问层实践

本章首先介绍了应用框架的三层架构,然后引入了数据库访问层的相关概念。为了便于读者理解数据库访问层,笔者讲解了业界常用的数据库访问层框架Hibernate、Ibatis和JPA,以及DSL风格的数据库访问层JEQUEL、JOOQ和Querydsl。通过比较它们的优缺点,分析了Tiny团队开发TinyDsl的原因,然后详细说明TinyDsl的实践过程。最后通过具体示例说明各种数据库访问层框架的用法和配置。

第6章 数据库扩展实践

本章侧重介绍数据库水平扩展方案。首先从互联网的发展所导致的业务应用压力日益增加,从而让读者认识到数据库水平扩展方案对Java EE企业级应用是非常合理的需求。论证了水平扩展的合理性之后,列举了常见的扩展层次:DAO层、DataSource层、JDBC层和Proxy层,重点讲解了Tiny分库分表的技术架构和设计思路,并讲解了分库分表、读写分离和集群事务的处理,还与开源软件Routing4DB做了详细对比。最后通过具体示例演示数据库水平扩展的配置和增删改查的结果。

第7章 服务层实践

本章首先介绍了传统的服务层定义,以及与表现层、业务逻辑层的关系,然后讲解了Tiny对服务层的改进,通过重新定义服务概念,引入服务定义、服务注册和服务中心的设计思路。基于Tiny服务体系,应用可以不必关心服务提供方的具体信息。同时,由于远程调用与本地调用在代码层面并没有区别,所以系统根据不同场景进行多机部署或者单机部署时,无须对代码进行调整。远程调用体系由核心服务中心来组织整个调用网络,水平扩展极为容易。最后列举了本地场景、远程场景、单中心场景和多中心场景下,读者如何配置部署服务与服务中心。

第8章 流程引擎实践

本章介绍了面向对象编程的不足,引入了面向组件编程的概念。流程引擎框架(后文亦称之为Flow)是一款基于面向组件开发的组件流程执行框架。目前Flow支持两种流程:逻辑流程和页面流程。在设计部分,读者可以通过组件设计、流程管理、流程配置和流程执行了解流程引擎的强大。在实践部分笔者介绍了如何通过组件化开发算术表达式的流程。

第9章 元数据实践

本章介绍的是基本的元数据元素,包含方言模板、标准数据类型、业务数据类型和标准字段这几类基础元数据。最后的示例演示使用Eclipse插件设计元数据,包括通过工具动态生成业务Java代码和SQL语句。

第10章 展现层开发实践

本章首先介绍了Java EE展现层的常用代表技术Servlet、JSP和模板语言,并详细分析了三者的特性及优缺点。接着讲解了展现层方案设计,列举了设计人员常见的做法和技巧。然后给出了Tiny框架的展现层架构思路:采用模板语言做前端展示,同时引入组件包的概念,通过资源合并和压缩等框架手段,提升展现层的性能。最后演示了Tiny展现层的告警框和文本输入框的示例。

第11章 Web扩展实践

本章主要讲解了Tiny Web层框架的实践过程。首先介绍了Tiny Web层框架的由来及设计思想与设计原理。然后详细介绍了框架内置过滤器与处理器的使用方式。最后通过具体示例讲解Tiny Web层框架的开发过程,从而加强对Tiny Web层框架的理解。

……

编著


Specifications

Brand Jingdong book
Brand Origin China

Disclaimer

Product packaging, specifications and price are subject to change without notice. All information about the products on our website is provided for information purposes only. Please always read labels, warnings and directions provided with the product before use.

View Full Terms of Use
Add to favorites
{{ $isZh ? coupon.coupon_name_sub : coupon.coupon_ename_sub | formatCurrency }}
{{__("Buy Directly")}} {{ itemCurrency }}{{ item.directly_price }}
Quantity
{{ quantity }}
{{ instockMsg }}
{{ limitText }}
{{buttonTypePin == 3 ? __("Scan to view more PinGo") : __("Scan to start")}}
Sold by JD@CHINA
Ship to
{{ __("Ship to United States only") }}
Free shipping over 69
Genuine guarantee

Added to Cart

Keep Shopping

More to Consider

{{ item.brand_name }}

{{ item.item_name }}

{{ item.currency }}{{ item.market_price }}

{{ item.currency }}{{ item.unit_price }}

{{ item.currency }}{{ item.unit_price }}

Coupons

{{ coupon.coupon_name_new | formatCurrency }}
Clip Clipped Over
{{ getCouponDescStr(coupon) }}
{{ coupon.use_time_desc }}
Expires soon {{ formatTime(coupon.use_end_time) }}

Share this item with friends

Cancel

Yami Gift Card

Get this exclusive deal when paying with gift card

Terms and Conditions

Gift card deals are special offers for selected products;

The gift card deals will automatically be activated if a customer uses gift card balance at check out and the balance is sufficient to pay for the total price of the shopping cart products with gift card deals;

You will not be able to activate the gift card deals if you choose other payment methods besides gift card. The products will be purchased at their normal prices;

If your account balance is not enough to pay for the products with gift card deals, you can choose to reload your gift card balance by clicking on the Reload button at either shopping cart page or check out page;

Products that have gift card deals can be recognized by a special symbol showing 'GC Deal';

For any additional questions or concerns, please contact our customer service;

Yamibuy reserves the right of final interpretation.

Sold by Yami

Service Guarantee

Yami Free Shipping over $49
Yami Easy Returns
Yami Ships from United States

Shipping

  • United States

    Standard Shipping is $5.99 (Excluding Alaska & Hawaii). Free on orders of $49 or more.

    Local Express is $5.99 (Available in Parts of CA, NJ, MA & PA). Free on orders of $49 or more.

    2-Day Express (Includes Alaska & Hawaii) starts at $19.99.

Return Policy

Yami is committed to provide our customers with a peace of mind when purchasing from us. Most items shipped from Yamibuy.com can be returned within 30 days of receipt of shipment (For Food, Beverages, Snacks, Dry Goods, Health supplements, Fresh Grocery and Perishables Goods, within 7 days of receipt of shipment due to damages or quality issues; To ensure that every customer receives safe and high-quality products, we do not provide refunds or returns for beauty products once they have been opened or used, except in the case of quality issues; Some products may have different policies or requirements associated with them, please see below for products under special categories, or contact Yami Customer Service for further assistance).
Thank you for your understanding and support.

Learn More

Sold by Yami

Terms and Conditions of Yami E-Gift Card

If you choose “Redeem automatically” as your delivery method, your gift card balance will be reload automatically after your order has been processed successfully;

If you choose “Send to Email”as your delivery method, the card number and CVV will be sent to the email address automatically;

Any user can use the card number and CVV to redeem the gift card, please keep your gift card information safely. If you have any trouble receiving email, please contact Yami customer service;

Yami gift card can be used to purchase both Yami owned or Marketplace products;

Yami gift card will never expire;

Yami gift card balance does not have to be used up at once;

All rights reserved by Yami.

Return Policy

Gift card that has already been consumed is non-refundable.

Sold by JD@CHINA

Service Guarantee

Yami Free Shipping over $49
Yami Easy Returns
Yami Ships from United States

Shipping

  • United States

    Standard Shipping is $5.99 (Excluding Alaska & Hawaii). Free on orders of $49 or more.

    Local Express is $5.99 (Available in Parts of CA, NJ, MA & PA). Free on orders of $49 or more.

    2-Day Express (Includes Alaska & Hawaii) starts at $19.99.

Return Policy

You may return product within 30 days upon receiving the product. Items returned must be new in it's original packing, including the original invoice for the purchase. Customer return product at their own expense.

Sold by JD@CHINA

Service Guarantee

Yami Cross-store Free Shipping over $69
Yami 30-days Return

Yami-China FC

Yami has a consolidation warehouse in China which collects multiple sellers’ packages and combines to one order. Our Yami consolidation warehouse will directly ship the packages to your door. Cross-store free shipping over $69.

Return Policy

You may return products within 30 days upon receiving the products. Sellers take responsibilities for any wrong shipment or missing items. Packing needs to be unopened for any other than quality issues return. We promise to pack carefully, but because goods are taking long journey to destinations, simple damages to packaging may occur. Any damages not causing internal goods quality problems are not allowed to return. If you open the package and any quality problem is found, please contact customer service within three days after receipt of goods.

Shipping Information

Yami Consolidation Service Shipping Fee $9.99(Free shipping over $69)

Sellers in China will ship their orders within 1-2 business days once the order is placed. Packages are sent to our consolidation warehouse in China and combined there. Our Yami consolidation warehouse will directly ship the packages to you via UPS. The average time for UPS to ship from China to the United States is about 10 working days and it can be traced using the tracking number. Due to the pandemic, the delivery time may be delayed by about 5 days. The package needs to be signed by the guest. If the receipt is not signed, the customer shall bear the risk of loss of the package.

Sold by JD@CHINA

Service Guarantee

Free shipping over 69
Genuine guarantee

Shipping

Yami Consolidated Shipping $9.99(Free shipping over $69)


Seller will ship the orders within 1-2 business days. The logistics time limit is expected to be 7-15 working days. In case of customs clearance, the delivery time will be extended by 3-7 days. The final receipt date is subject to the information of the postal company.

Yami Points information

All items are excluding from any promotion or points events on Yamibuy.com

Return Policy

You may return product within 30 days upon receiving the product. Items returned must be new in it's original packing, including the original invoice for the purchase. Customer return product at their own expense.

Yami

Download the Yami App

Back Top

Recommended for You

About the brand

Jingdong book

为您推荐

Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折
Yami
欣葉
2种选择
欣叶 御大福 芋头麻薯 180g

周销量 600+

$1.66 $1.99 83折

Reviews{{'('+ commentList.posts_count + ')'}}

Have your say. Be the first to help other guests.

Write a review
{{ totalRating }} Write a review
  • {{i}} star

    {{i}} stars

    {{ parseInt(commentRatingList[i]) }}%

Yami Yami
{{ comment.user_name }}

{{ showTranslate(comment) }}Show Less

{{ strLimit(comment,800) }}Show more

Show Original

{{ comment.content }}

Yami
Show All

{{ formatTime(comment.in_dtm) }} VERIFIED PURCHASE {{groupData}}

{{ comment.likes_count }} {{ comment.likes_count }} {{ comment.reply_count }} {{comment.in_user==uid ? __('Delete') : __('Report')}}
Yami Yami
{{ comment.user_name }}

{{ showTranslate(comment) }}Show Less

{{ strLimit(comment,800) }}Show more

Show Original

{{ comment.content }}

Yami
Show All

{{ formatTime(comment.in_dtm) }} VERIFIED PURCHASE {{groupData}}

{{ comment.likes_count }} {{ comment.likes_count }} {{ comment.reply_count }} {{comment.in_user==uid ? __('Delete') : __('Report')}}

No related comment~

Review

Yami Yami

{{ showTranslate(commentDetails) }}Show Less

{{ strLimit(commentDetails,800) }}Show more

Show Original

{{ commentDetails.content }}

Yami
Show All

{{ formatTime(commentDetails.in_dtm) }} VERIFIED PURCHASE {{groupData}}

{{ commentDetails.likes_count }} {{ commentDetails.likes_count }} {{ commentDetails.reply_count }} {{commentDetails.in_user==uid ? __('Delete') : __('Report')}}

Please write at least one word

Comments{{'(' + replyList.length + ')'}}

Yami Yami

{{ showTranslate(reply) }}Show Less

{{ strLimit(reply,800) }}Show more

Show Original

{{ reply.reply_content }}

{{ formatTime(reply.reply_in_dtm) }}

{{ reply.reply_likes_count }} {{ reply.reply_likes_count }} {{ reply.reply_reply_count }} {{reply.reply_in_user==uid ? __('Delete') : __('Report')}}

Please write at least one word

Cancel

That’s all the comments so far!

Write a review
How would you rate this item?

Please add your comment.

  • A nice nickname will make your comments more popular!
  • The nickname in your account will be changed to the same as here.
Thanks for your review
Our community rely on great reviews like yours to find the best of Asia.

Report

If you find this content inappropriate and think it should be removed from the Yami.com site, let us know please.

Cancel

Are you sure to delete your review?

Cancel

You’ve Recently Viewed

About the brand

Jingdong book