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

tips(分层架构和职责划分)
Liuxz在 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
// 标识为配置类
// 扫描指定包下的Bean
public class SpringConfig {
// 可以手动定义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
public class UserController {
private UserService userService; // 注入服务层对象
public User getUser( Long id) {
return userService.getUserById(id); // 调用服务层方法
}
}前端通过
/users/1接口请求时,会触发该方法。
4. dao(数据访问层,Data Access Object)
含义:直接操作数据库,负责数据的 CRUD(增删改查)。
作用:隔离业务逻辑与数据库操作,通常与数据库交互。
实际应用:
java
运行
1
2
3
4
5// dao/UserDao.java
// 标识为数据访问层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
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
// 标识为服务层Bean
public class UserService {
private UserDao userDao; // 注入数据访问层对象
// 事务管理
public User getUserById(Long id) {
// 业务逻辑:如判断id是否合法
if (id == null || id <= 0) {
throw new IllegalArgumentException("无效ID");
}
return userDao.selectById(id); // 调用DAO层方法
}
}
这些包如何协同工作?
用户请求流程:
前端请求 →Controller接收 → 调用Service处理业务 →Service调用DAO操作数据库 →DAO返回数据 →Service处理结果 →Controller返回响应。Spring 的作用:
- 通过
@Component、@Service等注解,Spring 自动扫描这些包,将类实例化为 Bean 并放入 IoC 容器。 - 通过
@Autowired实现 Bean 之间的依赖注入(如 Controller 注入 Service,Service 注入 DAO),无需手动new对象。 config包中的配置类告诉 Spring 如何管理这些 Bean(如扫描范围、事务规则)。
- 通过
总结
这种分层结构是 Spring 项目的经典设计,核心思想是 “高内聚、低耦合”:
- 每层只关注自己的职责(如 Controller 只处理请求,Service 只处理业务)。
- 层与层之间通过接口交互,方便后续修改(如换数据库时只需改 DAO 层,不影响 Service 和 Controller)。
实际开发中,可能还会根据需求增加util(工具类)、exception(异常处理)等包,但核心分层思想不变。



