tips(分层架构和职责划分)

在 Spring 项目中,这些文件夹(包)是按照分层架构职责划分来组织代码的,目的是让项目结构清晰、职责明确,符合面向对象设计思想和 Spring 的最佳实践。下面分别解释每个包的含义和实际应用:

1. bean 或 entity(实体层)

  • 含义:存放 Java 实体类(POJO - Plain Old Java Object),对应数据库中的表结构。

  • 作用:用于封装数据,作为数据传输的载体。

  • 实际应用

    java

    运行

    1
    2
    3
    4
    5
    6
    7
    // bean/User.java
    public class User {
    private Long id;
    private String username;
    private String password;
    // getter/setter/构造方法
    }

    这个类的字段通常与数据库表的列一一对应,比如User类对应user表。

2. config(配置层)

  • 含义:存放 Spring 的配置类,替代传统的 XML 配置文件。

  • 作用:配置 Bean 的创建、依赖注入、AOP、事务管理等核心功能。

  • 实际应用

    java

    运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // config/SpringConfig.java
    @Configuration // 标识为配置类
    @ComponentScan("com.example") // 扫描指定包下的Bean
    public class SpringConfig {
    // 可以手动定义Bean,如数据源、事务管理器等
    @Bean
    public DataSource dataSource() {
    return new DruidDataSource();
    }
    }

3. controller(控制层)

  • 含义:接收用户请求,调用服务层处理,返回响应结果。

  • 作用:作为前端与后端的交互入口,负责参数校验、请求分发。

  • 实际应用

    java

    运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // controller/UserController.java
    @RestController
    @RequestMapping("/users")
    public class UserController {
    @Autowired
    private UserService userService; // 注入服务层对象

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
    return userService.getUserById(id); // 调用服务层方法
    }
    }

    前端通过/users/1接口请求时,会触发该方法。

4. dao(数据访问层,Data Access Object)

  • 含义:直接操作数据库,负责数据的 CRUD(增删改查)。

  • 作用:隔离业务逻辑与数据库操作,通常与数据库交互。

  • 实际应用

    java

    运行

    1
    2
    3
    4
    5
    // dao/UserDao.java
    @Repository // 标识为数据访问层Bean
    public interface UserDao {
    User selectById(Long id); // 查询用户
    }

    实际开发中,常用 MyBatis 或 JPA 实现接口,无需手动写 SQL(如 MyBatis 的 XML 映射文件)。

5. factory(工厂层,可选)

  • 含义:存放工厂类,用于创建复杂对象或控制对象的创建逻辑。

  • 作用:当 Bean 的创建过程复杂(如需要动态参数、多步骤初始化)时,用工厂模式封装创建逻辑。

  • 实际应用

    java

    运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // factory/UserFactory.java
    @Component
    public class UserFactory {
    public User createUser(String username) {
    User user = new User();
    user.setUsername(username);
    user.setPassword("default123"); // 默认密码
    return user;
    }
    }

    其他组件可通过注入UserFactory来创建User对象。

6. service(服务层)

  • 含义:存放业务逻辑代码,协调多个 DAO 完成复杂业务。

  • 作用:是 Controller 和 DAO 之间的桥梁,负责事务管理、业务规则校验。

  • 实际应用

    java

    运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // service/UserService.java
    @Service // 标识为服务层Bean
    public class UserService {
    @Autowired
    private UserDao userDao; // 注入数据访问层对象

    @Transactional // 事务管理
    public User getUserById(Long id) {
    // 业务逻辑:如判断id是否合法
    if (id == null || id <= 0) {
    throw new IllegalArgumentException("无效ID");
    }
    return userDao.selectById(id); // 调用DAO层方法
    }
    }

这些包如何协同工作?

  1. 用户请求流程
    前端请求 → Controller 接收 → 调用 Service 处理业务 → Service 调用 DAO 操作数据库 → DAO 返回数据 → Service 处理结果 → Controller 返回响应。

  2. Spring 的作用

    • 通过@Component@Service等注解,Spring 自动扫描这些包,将类实例化为 Bean 并放入 IoC 容器。
    • 通过@Autowired实现 Bean 之间的依赖注入(如 Controller 注入 Service,Service 注入 DAO),无需手动new对象。
    • config包中的配置类告诉 Spring 如何管理这些 Bean(如扫描范围、事务规则)。

总结

这种分层结构是 Spring 项目的经典设计,核心思想是 “高内聚、低耦合”

  • 每层只关注自己的职责(如 Controller 只处理请求,Service 只处理业务)。
  • 层与层之间通过接口交互,方便后续修改(如换数据库时只需改 DAO 层,不影响 Service 和 Controller)。

实际开发中,可能还会根据需求增加util(工具类)、exception(异常处理)等包,但核心分层思想不变。