Skip to content

前言

最近写「JavaWeb」项目的时候,发现MVC分层架构往往不只三层,还有其他层。秘书给我查查。🧐

Java的分层架构

如果你写过web项目,你可能见过这种“约定”😶

一般Java后端会有这几种层结构

DaoEntityServiceControllerview

Entity(domain)层:实体类层

Entity层(实体类层)主要用于表示业务对象和数据表之间的映射关系。每个数据库表都对应着一个实体对象,而实体对象就是一个属性与表中的字段一一对应的普通 Java 类。

  • Entity 层中,我们通常使用 ORM 框架来完成对象关系映射的工作,使得应用程序中的 Java 对象可以与数据库中的数据互相转换。

  • Entity 层还可以定义一些业务逻辑相关的方法,例如计算属性、获取或修改数据、验证数据等等。

  • Entity 类,需要遵循 「SOLID 原则」,确保其单一职责、高内聚、低耦合、易扩展和易维护。

java
public class User {
    private Long id;
    private String username;
    private String email;
    
    // Constructors, getters, setters, and other methods
}

Dao(mapper)层:数据访问层

Dao(Data Access Object)层(通常也称为数据访问层或Mapper层)负责封装底层数据访问技术的细节,为上层的服务层提供统一的接口,以便进行数据存储、读取和更新等操作。Dao层的主要职责包括:封装数据源,对象关系映射(ORM),增删改查(CRUD)操作,事务处理,缓存管理等等。

java
public interface UserDao {
    User findById(Long id);
    User findByUsername(String username);
    void save(User user);
    void update(User user);
    void delete(User user);
}

Service层:服务层

Service层(也称为业务层)通常位于控制器层和数据访问层之间,它负责处理业务逻辑、调用 Dao 层完成数据操作,并将结果返回给控制器层。

  • Service 层中,通常包含着应用程序的核心业务逻辑,例如用户认证、权限管理、订单处理等。
  • Service层为控制器层提供了高层次的 API 接口,以暴露应用程序的功能,并封装了底层 Dao 层的细节实现。
  • Service层还可以承担其他重要的职责,如数据校验、事务管理、缓存管理、异步处理等等
java
public interface UserService {
    User getUserById(Long id);
    User getUserByUsername(String username);
    void createUser(User user);
    void updateUser(User user);
    void deleteUser(User user);
}
// 业务实现类
public class UserServiceImpl implements UserService {
    private UserDao userDao;
    
    // Constructor or dependency injection for UserDao
    
    @Override
    public User getUserById(Long id) {
        return userDao.findById(id);
    }
    
    @Override
    public User getUserByUsername(String username) {
        return userDao.findByUsername(username);
    }
    
    @Override
    public void createUser(User user) {
        // Perform any necessary business logic or validation
        userDao.save(user);
    }
    
    @Override
    public void updateUser(User user) {
        // Perform any necessary business logic or validation
        userDao.update(user);
    }
    
    @Override
    public void deleteUser(User user) {
        // Perform any necessary business logic or validation
        userDao.delete(user);
    }
}

Controller(action)层:控制层

Controller层(控制器层)通常位于 业务层和视图层之间,它负责接收用户请求、调度相应的业务层完成业务逻辑处理,并将结果返回给视图层进行展示。

  • Controller 层中,每个请求通常对应着一个 Action 方法,用于处理用户提交的数据、获取需要的信息或者调用相应的服务。
  • Action 方法通常会根据不同的请求类型(如 GETPOST 等)进行分类,也可以使用注解来处理请求映射、参数绑定、数据验证等工作。
  • Controller 层还承担了其他一些任务,如异常处理、日志记录、安全性过滤等。它是整个应用程序与用户交互的入口。
java
public class UserController {
    private UserService userService;
    
    // Constructor or dependency injection for UserService
    
    public void createUser(String username, String email) {
        User user = new User();
        user.setUsername(username);
        user.setEmail(email);
        
        userService.createUser(user);
        
        // Perform any necessary view-related operations or redirect to another page
    }
    
    public void updateUser(Long id, String newUsername) {
        User user = userService.getUserById(id);
        
        if (user != null) {
            user.changeUsername(newUsername);
            userService.updateUser(user);
            
            // Perform any necessary view-related operations or redirect to another page
        } else {
            // Handle the case where the user is not found
        }
    }
    
    // Other controller methods for handling user-related operations
}

View层:视图层

在前后端分离的项目中一般没有视图层😶

View层(视图层)负责将服务端生成的数据呈现给用户,并与用户进行交互。

  • View 层采用 HTMLCSSJavaScript 等前端技术来实现页面的展示和用户响应。
  • View 层,开发人员通常使用模板引擎或前端框架来进行开发,以便快速构建用户友好的页面,并将数据渲染到页面上。
  • View 层还可以处理用户输入、响应用户事件,并与后台进行异步交互等。
java
public class UserView {
    private UserController userController;
    
    // Constructor or dependency injection for UserController
    
    public void createUser(String username, String email) {
        userController.createUser(username, email);
        
        // Update the view accordingly, e.g., display a success message
    }
    
    public void updateUser(Long id, String newUsername) {
        userController.updateUser(id, newUsername);
        
        // Update the view accordingly, e.g., display a success message
    }
    
    // Other view methods for displaying and interacting with user-related data
}

java开发各层对象含义

Java不仅有各种层,还有各种对象,怎么样?汗流浃背了吧🙃

在 Java 编程中,通常会使用以下几种对象

Entity对象VO对象DAO对象POJO对象DTO对象

Entity:实体对象

实体对象代表了系统中的实际业务实体,通常与数据库中的表相映射。实体对象封装了实体的属性和行为,并提供对数据的访问方法。它们在应用程序中用于表示和操作业务数据。

java
public class User {
    private Long id;
    private String username;
    private String email;
    
    // Constructors, getters, setters, and other methods
    
    // Example of a behavior method
    public void changeUsername(String newUsername) {
        // Validate the new username
        // Update the username in the database
        this.username = newUsername;
    }
}

VO (Value Object) :值对象

值对象,是为了在不同层之间传递数据而设计的对象。用于封装一组相关的数据,通常用于数据传输。值对象是一种轻量级的对象,它们通常是不可变的,只包含数据,没有业务逻辑,通常也不涉及到数据库操作。

java
public class Address {
    private String street;
    private String city;
    private String state;
    private String zipCode;
    
    // Constructors, getters, and setters
}

DAO (Data Access Object):数据访问对象

数据访问对象封装了针对数据库的CRUD操作,提供给业务层进行调用。DAO提供了一组接口或抽象类,定义了对数据的增删改查等操作。它们负责与数据库进行交互,并提供数据的持久化和检索功能。

java
public interface UserDao {
    User findById(Long id);
    void save(User user);
    void update(User user);
    void delete(User user);
}

DTO (Data Transfer Object ) :数据传输对象

数据传输对象一般会包含多个属性,并且这些属性可以来自不同的实体类或数据库表。通过使用数据传输对象,我们可以避免在不同层之间频繁地传递大量数据,从而提升系统的性能和可扩展性。还可以起到数据过滤和隐藏敏感信息等作用。

java
public class UserDTO {
    private String username;
    private String email;
    
    // Constructors, getters, and setters
}

POJO (Plain Old Java Object) :简单 Java 对象

普通的 Java 对象,没有继承特定类或实现特定接口,也没有被框架注解标记。是一种轻量级的 Java 类型,通常用于表示各种对象,包括实体对象、数据传输对象、值对象等。

java
public class Product {
    private String name;
    private double price;
    
    // Constructors, getters, and setters
}

提示

其实还有 PO,BO 等对象,因为不常用,所以这里不作说明了,有兴趣可以自行搜索。

写在最后

其实Java分层架构不过是遵循了“高内聚,低耦合”原则,”单一职责“原则等等,实现各种层的层层抽象。每层有各自的职责,使JavaWeb开发更加效率和容易。

反正都是抽象,”面向抽象编程“🤪

参考三三

如有转载或 CV 请标注本站原文地址