分层解耦-三层架构
为了分离职责,方便管理,我们将整个后端的架构分为三层
- 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