最近由于实训,发现很多同学都在开发 Java 后台,因此少不了重复繁杂的配置工作,这个框架就是为了减少这些不必要的工作。它集成了 Spring Boot 和 MyBatis,并实现了一个类似“书籍管理”的模块(支持 RESTful API)以供参考,框架简单易懂。完全可以根据自己的需要,修改这个框架,以实现自己想实现的功能。
- Spring Boot
- MyBatis
- MySQL or HSQLDB (a in-memory database)
- Maven
- Commons Logging
- Java 8 Lambda Expressions
- Lombok
- Apache Commons Lang
这个项目其实有点像一个 Demo 项目。我没有将 Spring Boot、MyBatis 和其他框架提供的功能再封装一层(虽然可以这样做),以提供更加应用级的接口。这是因为我觉得这些框架已经提供了很好的封装度和灵活度,完全只需要“掌控”他们,再“利用”他们,你就能实现你想要的。既然是一个 Demo 项目,所以对于初学者,还是有必要讲解一下其中的“门道”。对于我个人来说,这一个部分就有点像在回忆:“我当时怎么做的,为什么这样做”。(顺序有点乱,请根据需要阅读)
`-- src
|-- main
| |-- java
| | `-- com
| | `-- shawn
| | |-- constant
| | |-- model
| | | |-- dto
| | | `-- entity
| | |-- monitor
| | |-- repository
| | | `-- mybatis
| | |-- service
| | | `-- impl
| | |-- util
| | `-- web
| | |-- controller
| | |-- excetpion
| | `-- filter
| `-- resources
| |-- com
| | `-- shawn
| | `-- repository
| | `-- mybatis
| `-- db
| `-- hsqldb
`-- test
`-- ...(& so on)
- src/main/java/com/shawn/constant: 该目录放置了各种常量类
- src/main/java/com/shawn/model: 该目录放置了各种模型类,其子目录 dto 放置了 DTO(Data Trasfer Object)类,其另一子目录 entity 放置了实体类
- src/main/java/com/shawn/monitor: 该目录放置了各种监测类
- src/main/java/com/shawn/repository: 该目录放置了数据库增删改查的接口,其子目录 impl 放置了这些接口的实现类
- src/main/java/com/shawn/service: 该目录下放置服务(一个服务对应于一些业务逻辑的集合)的接口,其子目录 impl 放置了这些接口的实现类
- src/main/java/com/shawn/util: 该目录放置了各种工具类
- src/main/java/com/shawn/web: 该目录放置了和网络层相关的一切,包括控制器、异常处理、过滤器等等
- src/main/resources/com/shawn/repository/mybatis: 该目录放置了 MyBatis 的映射器 XML 文件
- src/main/resources/db: 该目录放置了有关内存数据库的脚本,其子目录 hsqldb 放置了 HSQL 的数据库脚本
为了节约时间就不谈架构的重要性了,那我们先把关注点放在 Web 应用的职责上(Web 应用应该做些什么):
- 它应该能够处理用户的输入,并且返回正确的相应给用户
- 它应该拥有一套异常处理机制,来应对错误发生的时候
- 它应该拥有一个事务管理策略
- 它应该能够对用户进行认证和授权
- 它应该要实现业务逻辑,为用户提供服务
- 它应该要能操纵数据库和其他资源
- ……
那么,怎样才能,既实现这些职责,又达到低耦合高内聚(提供一定的封装度和灵活度)的要求?三层架构可以支持这一切,它的概览如下图所示:
- Web层:Web 应用的最顶层。它负责处理用户输入以及返回正确的相应给用户;处理其他层抛出的异常并向用户反映错误的发生;对用户进行认证,拒绝未认证的用户访问。
- Service层:Web 应用的中间层。它应该组织业务逻辑,为 Web 层提供服务;使得所有服务都是事务性的(要么完成,要么什么都没做);负责用户的授权。
- Repository层:Web 应用的最底层。它负责操纵数据库,以实现对数据库的增删改查。
那么,这三层的组件要如何交互呢?最佳实践是:上层组件使用下层组件,使用模型(Model)作为交互媒介。模型包括两种:数据传输对象(DTO)和领域模型(Domain Model)。
- DTO: 一种用户可见的数据容器。它用来传输用户可见的数据,屏蔽了 Web 应用的内部实现。
- Domain Model: 具有领域特征的数据容器。一般来说,它对应于数据库中的表,它代表了 Web 应用的内部实现,应该对用户透明。
一直以来,都觉得 POJO 类里面的 get、set 方法使得代码显得非常臃肿,不像 C# 里从语言层面支持了 get 访问器和 set 访问器。那么在 Java 中有没有类似可以消除这样冗余代码的技巧呢?答案就是 Lombok。Lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码。举个例子:
不使用 Lombok:
public class BookStore {
private long id;
private String name;
private String address;
public BookStore() {
}
public long getId() {
return id;
}
public BookStore setId(long id) {
this.id = id;
return this;
}
public String getName() {
return name;
}
public BookStore setName(String name) {
this.name = name;
return this;
}
public String getAddress() {
return address;
}
public BookStore setAddress(String address) {
this.address = address;
return this;
}
}
使用 Lombok:
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
@Accessors(chain = true)
@NoArgsConstructor
@Getter
@Setter
public class BookStore {
private long id;
private String name;
private String address;
}
在本项目中使用的 Lombok 注解有:
- @Accessors
- @NoArgsConstructor
- @Getter
- @Setter
- @ToString
- @CommonsLog
- Understanding Spring Web Application Architecture: The Classic Way
- MyBatis
- mybatis – MyBatis 3 | Mapper XML Files
- Mybatis关联查询一对一和一对多的实现 - 林炳文Evankaka的专栏 - 博客频道 - CSDN.NET
- Mybatis 鉴别器 - jordandandan的专栏 - 博客频道 - CSDN.NET
- Exception Handling in Spring MVC
- Spring Boot中Web应用的统一异常处理 | 程序猿DD
- java - Spring Boot REST service exception handling - Stack Overflow
- Getting Started · Managing Transactions
- HTTP Tutorial
- ResponseEntity (Spring Framework 4.3.4.RELEASE API)
- ServletUriComponentsBuilder (Spring Framework 4.3.4.RELEASE API)
- Optional (Java Platform SE 8 )
- Java 8 Optional类深度解析 - ImportNew
- Spring REST: Exception handling on a @Controller level
- Spring REST: Exception handling on a @ControllerAdvice level
- Spring REST: Exception handling on a @ControllerAdvice level
- Spring MVC中文翻译文档
- 22. Web MVC framework
- Spring Boot Reference Guide
- MIME 参考手册
- MIME - Wikipedia
- 多用途互联网邮件扩展 - 维基百科,自由的百科全书
- MIME协议分析 - 彭令鹏(bripengandre)的专栏 - 博客频道 - CSDN.NET
- Difference between CR LF, LF and CR line break types? - Stack Overflow
- Newline - Wikipedia
- http HEAD vs GET performance - Stack Overflow
- HTTP 缓存 | Web | Google Developers
- http - How to control web page caching, across all browsers? - Stack Overflow
- The BalusC Code: Webapplication performance tips and tricks
- Yahoo前端优化十四条军规 - 51CTO.COM
- Best Practices for Speeding Up Your Web Site - Yahoo Developer Network
- HTTP | MDN
- 解決問題的第一步: Authentication vs. Authorization
- Repositories | GitHub Developer Guide
- RESTful API 设计最佳实践 - 文章 - 伯乐在线
- Best Practices for Designing a Pragmatic RESTful API | Vinay Sahni
- POST /eff/you/this/is/the/right/url - RESTful API Design
- 418: I'm a teapot, and other bad API responses - RESTful API Design
- Error Handling: RESTful API Design Part III
- 11. Aspect Oriented Programming with Spring
- Chapter 6. 使用Spring进行面向切面编程(AOP)
- AOP with Spring Framework
- StopWatch (Apache Commons Lang 3.4 API)
