Loading...

分层解耦-三层架构

2025-04-08
1
-
- 分钟
|

分层解耦-三层架构

为了分离职责,方便管理,我们将整个后端的架构分为三层

  • controller:控制层,接收请求,处理,响应数据
  • service:业务逻辑层,处理具体的业务逻辑
  • dao:数据访问层,负责数据访问操作。

在这里插入图片描述

在这里插入图片描述

ImpL:实现 类 ** 后缀。

  • 耦合:衡量软件中各个层/模块的依赖关联程度
  • 内聚:软件中各个功能模块内部的联系

原则:高内聚,低耦合

那么,我们应该将代码进行优化,尽量确保实现各个层之间的改动完全不影响其他层,比如名称修改等。 我们可以使用springboot提供的容器来解耦

  • 控制反转:Inversion Of Control IOC。对象创建的控制权由应用程序自身转移到外部容器。
  • 依赖注入:Dependency Injection DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  • Bean对象IOC容器中创建,管理的对象,称之为Bean。 之前,我们想要使用不同类提供的功能先要创建一个类对象,这个命名就是一种耦合,更改譬如类名就会影响到各个层级(最简单的例子),那么我们可以使用bean对象来管理,使用时进行注入就可以很好的进行解耦。管理类的容器叫做ioc容器,对象叫bean对象

IOC & DI 入门 将实现类交给IOC容器管理 @Component

/*
    如下面的类,添加@Component会使该类交给IOC容器管理,使用时再注入
*/

@Component
public class UserDaoImpl implements UserDao {
    @Override
    public List<String> findAll() {
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");
        ArrayList<String> lines = IoUtil.readLines(in, "UTF-8", new ArrayList<>());
        return lines;
    }
}

为代码注入运行时所依赖的对象: @Autowired

/*
    如下面的类,添加@Autowired会在构造器中注入对象UserDaoImpl
*/
@Component // 将类产生的对象交给spring的容器管理,bean对象
public class UserServiceImpl implements UserService {
    // 使用分层解耦思想
    // 应用程序运行时会在bean容器中自动查询该类型的对象,并注入到成员变量中
    private final UserDao userDao;
    // 构造器注入
    @Autowired
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public List<User> findAll() {
        // 调用dao获取数据
        List<String> lines = userDao.findAll();
        List<User> userList = lines.stream().map(line -> {
            String[] parts = line.split(",");
            Integer id = Integer.parseInt(parts[0]);
            String username = parts[1];
            String password = parts[2];
            String name = parts[3];
            Integer age = Integer.parseInt(parts[4]);
            LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            return new User(id, username, password, name, age, updateTime);
        }).toList();

        return userList;
    }
}

IOC详解 除了Component,还提供了衍生注解方便标识不同的架构处理。

  • @Component:声明bean的基础注解
  • @Controller:标注在控制类上,但是@RestController已经包含了,不需要再注解了!!!
  • @Service:标注在业务层类上
  • @Repository:标注在数据访问层上(由于与mybatis整合,用的少)

声明bean的时候,可以通过注解的value属性指定bean的名字,如果没有指定,默认为类名首字母小写。

在这里插入图片描述

DI详解 注入的方式

在这里插入图片描述

建议使用构造器注入。

@Autowired默认是按照类型注入的

如果存在多个相同类型的bean,将会报错

致谢:本文参考黑马程序员的视频。 https://www.bilibili.com/video/BV1yGydYEE3H/?vd_source=1b8f9bfb1d0891faf1c70d7678ae56db

文章目录