分层解耦
2025年10月30日大约 3 分钟
分层解耦
三层架构

- controller层:控制层,处理用户请求,调用业务逻辑层,返回响应结果。
- service层:业务逻辑层,处理业务逻辑,调用数据访问层,进行数据处理和业务
- dao层:数据访问层(持久层),负责与数据库进行交互,执行CRUD操作。
分层解耦
耦合:指系统中各个模块之间的依赖关系。耦合度高意味着模块之间依赖紧密,修改一个模块可能会影响其他模块。
内聚:指模块内部各个组件之间的关联程度。内聚度高意味着模块内部组件紧密相关,功能单一且明确。‘
软件设计的目标:实现低耦合高内聚。
控制反转(Inversion of Control,IoC):是一种设计原则,指将对象的创建和依赖关系的管理交给容器或框架,而不是由对象自身负责。
依赖注入(Dependency Injection,DI):是一种实现IoC的具体方式。通过DI,可以将对象的依赖关系通过构造函数、属性或方法参数注入到对象中,而不是由对象自行创建依赖对象。DI有三种常见的方式:构造函数注入、属性注入和方法注入。
Bean对象:IOC容器中创建管理的对象称为Bean对象。Bean对象通常是通过配置文件或注解定义的,容器负责创建、初始化和管理这些对象的生命周期。
IoC详解
- 要将对象交给IoC容器管理,需要在对应类上添加如下注解
| 注解 | 说明 | 位置 |
|---|---|---|
@Component | 通用组件注解,表示该类是一个组件,可以被IoC容器管理。 | 不属于下面三类时使用 |
@Controller | 控制层组件注解,表示该类是控制层组件。 | 控制层类上 |
@Service | 业务逻辑层组件注解,表示该类是业务逻辑层组件。 | 业务逻辑层类上 |
@Repository | 数据访问层组件注解,表示该类是数据访问层组件。 | 数据访问层类上(因为与mybatis整合,使用较少) |
Bean名
- 默认情况下,IoC容器会将类名的首字母小写作为Bean的名称。例如,UserService类的Bean名称为"userService"。
- 也可以通过在注解的value属性来指定定义Bean的名称,例如:
@Service("customServiceName")。
- 前面声明Bean的四个注解,要想生效,还需要被扫描组件注解
@ComponentScan所扫描到。 - 该组件虽然没有显式配置,但是实际上已经包含在启动类声明注解
@SpringBootApplication中- 默认扫描范围是启动类所在包及其子包
DI详解
常用依赖注入注解
| 注解 | 说明 | 位置 |
|:-----------😐:--------------------😐:----------------------😐
|@Autowired| 自动注入Bean对象 | 属性、构造函数、set方法上 |
|@Qualifier| 指定注入Bean对象的名称 | 属性、构造函数、set方法上 |
|@Resource| 按名称注入Bean对象 | 属性、set方法上(不推荐构造函数) |基于@Autowired注解实现依赖注入
- 属性注入
@RestController
public class UserController {
@Autowired
private UserService userService;
// 控制层方法
}- 构造函数注入
@RestController
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
// 控制层方法
}- set方法注入
@RestController
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
// 控制层方法
}