Spring框架中的四层架构:一场代码世界的"办公室喜剧"
想象一下,如果Spring框架是一家公司,那么它的四层架构就是四个部门,每天上演着一场精彩的"办公室喜剧"。今天,让我们走进这家公司,看看 Controller、Service、DAO 和Model 这四个"部门"是如何各司其职又密切配合的。
一、Controller层
1. Controller层:公司的"前台接待"
Controller
就像公司的前台接待,负责接待所有来访的"HTTP 请求客户",然后将他们引导到正确的部门。
@RequestMapping("/user")
@RestController
public class UserController {
@PostMapping("/login")
public boolean login(String username, String password) {
// 处理登录请求
return true;
}
}
在这段代码中,@RestController
注解就像是前台小姐姐胸前的工牌,表示“我是接待员,有事找我” ,而@RequestMapping
和PostMapping
则像前台的机号,告诉客户"要登录请按1"。
2. Controller层的@RestController
@RestController
是 SpringMVC 框架中一个核心注解,它是@Controller
和@ResponseBody
的组合注释。功能和作用:
- 表示控制器组件:告诉 Spring 这个类是一个处理 HTTP 请求的控制器
- 自动序列化返回值:将方法返回的对象自动转化为 JSON 或 XML 格式的 HTTP 响应
- 简化 RESTful API 开发:省去了每个方法都添加
@RequestBody
的麻烦
二、Service层
1. Service层:公司的"中层经理"
@Service
就像公司中的中层经理,负责协调各种资源,完成具体的业务任务。
@Service
public class BookService {
@Autowired
private BookDao bookDao;
//二次处理借阅状态 1-可借阅 2-不可借阅
public List<BookInfo> getList() {
List<BookInfo> bookInfos = bookDao.mockData();
for (BookInfo bookInfo : bookInfos) {
if (bookInfo.getStatus() == 1) {
bookInfo.setStatusCN("可借阅");
} else {
bookInfo.setStatusCN("不可借阅");
}
}
return bookInfos;
}
}
在这段代码中,@Service
就像经理办公室中的门牌号一样,而getList()
展示了经理的工作方式:从DAO中取出原始数据,进行加工(将数字状态码转化为人类可阅读文本),最后返回处理后的数据。这就像王经理拿到原始的销售数据后,将其整理漂亮的表格发送给老板一样。
2. Service层的@Service
@Service
是 Spring 框架用来标识处理业务逻辑层组件的注释。功能和作用:
- 表示服务组件:告诉 Spring这个类包含业务逻辑
- 自动注册为Bean:使得该类能够被 Spring 容器管理,便于依赖注入
- 语义化标识:提高代码的可读性,明确表示这是服务层组件
3. Service层的@Autowired
@Autowired
是 Spring框架实现依赖注入的核心注释,它像是各层组件的“自动连接器”,使得:
- Controller 自动获取 Service 的实例
- Service 自动获取 DAO 的实例
- 各组件能够专心的执行各自的任务,而不必关心如何创建和获取依赖
用户请求
|
v
@RestController (BookController)
| @Autowired
v
@Service (BookService)
| @Autowired
v
@Repository (BookDao)
|
v
数据库
三、DAO层
1. DAO层:公司的"数据操作专员"
DAO 层就像公司的档案管理员,专门负责数据的存取,不关心这些数据用来做什么。
@Repository
public class BookDao {
// mock(模拟) 从数据库中查询数据
public List<BookInfo> mockData() {
List<BookInfo> bookInfos = new ArrayList<>();
for (int i = 1; i <= 15; i++) {
BookInfo bookInfo = new BookInfo();
bookInfo.setBookId(i);
bookInfo.setBookName("图书" + i);
bookInfo.setPublish("出版社" + i);
bookInfo.setAuthor("作者"+i);
bookInfo.setNum(new Random().nextInt(100)); // 生成 0~99 随机数
bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));
bookInfo.setStatus(i % 5 == 0 ? 2 : 1); // 1-可借阅 2-不可借阅
bookInfos.add(bookInfo);
}
return bookInfos;
}
}
这里的@Repository
注解就像档案室的标牌,而 mockData() 方法则是档案管理员的"取档案"动作。
2. DAO层的@Repository
@Repository
是 Spring 框架用来标识数据访问层组件的注释。功能和作用:
- 标识DAO组件:告诉 Spring 这个类负责数据访问层的操作
- 异常转换:自动将特定于数据库中的异常转换为 Spring 的 DataAccessException
- 自动注册为Bean:使该类能被Spring容器管理,便于依赖注入
四、Model层
1. Model层:公司的"信息载体"
@Data
就像是一个神奇的文件夹,你只需要放入基本信息(字段定义),它就会自动为你准备好所有需要的文件结构(getter、setter等方法),大大减少了手工填写表格(编写样板代码)的工作。
import lombok.Data;
import java.math.BigDecimal;
@Data
public class BookInfo {
private Integer bookId;
private String bookName;
private String author;
private Integer num;
private BigDecimal price;
private String publish;
private Integer status;
private String statusCN;
}
2. Model层的@Data
@Data
是 Lombok 库提供的注释,不是 Spring 框架的一部分,但在 Spring 中被广泛应用于 Model 类。功能和作用:
- 自动生成 setter/getter:为所有字段生成访问器和修改器方法
- 自动生成 toString():生成包含所有字段的 toString 方法
- 自动生成 equals() 和 hashCode():基于所有非静态、非 transient 字段生成这两个方法
- 自动生成构造函数:生成一个包含所有 final 字段的构造函数
四、形象类比
1. 餐厅服务流程
想象一下去餐厅吃饭时:
顾客请求 -> 服务员(@Controller)
-> 厨师(@Service) <-- @Autowired(自动连接) -->
仓库管理员(@Repository) <--> 食材仓库(Database)
- 顾客需要一份“宫保鸡丁”
- 服务员(
@Controller
)接单并传给厨房:“三号桌要一份宫保鸡丁” - 厨师(
Service
)需要食材,通过@Autowired
自动找到仓库管理员(@Repository
) - 仓库管理员从食材仓库(
Database
)取出鸡肉、花生、辣椒等原材料 - 厨师(
Service
)加工食材,做成美味的宫保鸡丁 - 服务员(
Controller
)将成品送到顾客桌上
2. 公司注册流程
客户 -> 填写注册表单 -> 点击提交
前台小美(Controller) -> 接收表单数据 -> 转换为 Customer 对象
王经理(Service) -> 验证数据 -> 处理业务逻辑
小李(DAO) -> 将数据存入数据库(Database)中
数据以 Customer(Model) 形式在各层之间传递
这个例子生动展示了从用户操作到数据存储的完整流程,每一层都有明确的职责。
五、总结
1. Spring 的四层架构
Spring 的四层架构就像一个高效运转的公司,每个"部门"各司其职又紧密配合:
- Controller:接待客户,处理请求
- Service:实现业务逻辑,协调多个操作
- DAO:执行数据库操作,提供原始数据
- Model:在各层之间传递数据
这种分层架构不仅提高了代码的可维护性和可测试性,也使得团队协作更加顺畅——就像一场精心编排的"办公室喜剧",每个角色都有自己的台词和动作,共同完成一部精彩的作品。
2. Spring 框架的四种注释
Spring 框架的这四种注解不仅仅是代码的标记,更是一种架构设计的体现:
- @RestController:处理HTTP请求,是系统的"前台接待"
- @Service:实现业务逻辑,是系统的"中层管理"
- @Repository:执行数据操作,是系统的"数据管理员"
- @Data:简化模型类开发,是系统的"信息载体"
通过这些注解,Spring 框架实现了关注点分离,使得代码结构更加清晰,开发效率更高,维护成本更低。每个组件专注于自己的职责,又能通过 Spring 的依赖注入机制无缝协作,共同完成复杂的业务功能。