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 注解就像是前台小姐姐胸前的工牌,表示“我是接待员,有事找我” ,而@RequestMappingPostMapping则像前台的机号,告诉客户"要登录请按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)
  1. 顾客需要一份“宫保鸡丁”
  2. 服务员(@Controller)接单并传给厨房:“三号桌要一份宫保鸡丁”
  3. 厨师(Service)需要食材,通过@Autowired自动找到仓库管理员(@Repository)
  4. 仓库管理员从食材仓库(Database)取出鸡肉、花生、辣椒等原材料
  5. 厨师(Service)加工食材,做成美味的宫保鸡丁
  6. 服务员(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 的依赖注入机制无缝协作,共同完成复杂的业务功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值