本篇主要对Controller+Service+DAO三层结构以及控制反转(IOC)与DI(依赖注入)进行总结。
目录
一、三层架构:
Controller/Service/DAO简介:
二、控制反转(IOC)-依赖注入(DI):
概念介绍:
DOC与DI的引入:
使用注解来实现IOC与DI:
一、三层架构:
前言:
如果将代码都写到一个类中,包括数据访问(解析xml文件)逻辑处理,接收请求,响应数据等功能;这种方式会导致代码非常臃肿,复用性差,并且难以维护,实际开发中,尽量保持单一职责原则,所以要分开进行操作,由此引出三层架构:Controller+Service+DAO;
Controller/Service/DAO简介:
- Controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
- Service:业务逻辑层,处理具体的业务逻辑。
- DAO:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括对数据的增删改查等。
整体的流程如下:
首先客户端发送请求到Controller层,Controller接收请求后,调用Service层进行逻辑处理,Service层需要获取数据所以调用DAO层获取数据,DAO返回数据后Service层进行逻辑处理,返回处理后的数据到Controller层,Controller层响应数据到前端界面;这就是三层架构;
二、控制反转(IOC)-依赖注入(DI):
概念介绍:
先对下面提到的几个概念进行简单的介绍:
- 内聚:软件中各个功能模块内部的功能联系。
- 耦合:衡量软件中各个层或模块之间的依赖、关联程度。
- 软件设计原则:高内聚低耦合。
- 控制反转:Inversion Of Control,简称IOC,对象的创建控制权由程序自身转移到外部容器,这种思想就叫做控制反转。
- 依赖注入:Dependency Injection,简称DI,容器为应用程序提供运行时,所依赖的资源称之为依赖注入。
- Bean对象:IOC容器中创建、管理的对象称之为Bean对象。
DOC与DI的引入:
前面讲了三层架构,如果按照这样的流程来接收前端发送的请求并处理请求,就需要在各个层中定义相应的对象,比如说Controller层调用Service层的方法来获取数据,此时Controller层需要new一个Service对象,所以他们两个耦合程度比较高,如果Service换了名字,Controller层也要改变,所以这种方式有很大的缺陷,同样Service和DAO层也一样的情况;
所谓高内聚,例如service层只对客户这种类型数据进行处理,不对其他类型进行处理;实际开发中软件设计原则是高内聚低耦合,这样当Service代码变化,不需要改变Controller层的代码;
所以为了解决这种缺陷,实现解耦操作,在各个层中不用通过new来创建类的对象,可以采用一个容器,这个容器中存放对应的对象,如果Service层中叫做ServiceA那么此时容器中存放一个ServiceA类型的对象,然后Controller层去容器中寻找这个对象然后从容器中拿到这个对象然后调用相应的方法。如果Service层的名称改为ServiceB,此时就在容器中存放一个ServiceB的对象,然后Controller层去寻找即可,无需更改Controller层的代码。那么如何实现这个容器?——通过IOC与DI来实现。
使用注解来实现IOC与DI:
控制反转(IOC):首先一般用下面三种注解实现控制反转,如果有一个不属于那三类,可以用@Component。利用注解来修饰类,将这个类的对象控制权交给IOC容器管理。
依赖注入(DI):如果想在Controller层中使用Service层的对象,需要在创建的对象前面加上@Autowired注解;
演示如下:
Controller层:通过@Autowired注解实现依赖注入,获取IOC容器中Service层的对象:
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
Service层:通过@Service注解实现将Service类的对象创建与管理交给IOC容器,这样Controller层就可以从IOC容器中获取此类对象。通过@Autowired注解实现依赖注入,获取IOC容器中DAO层的对象:
@Service
public class DeptLogServiceImpl implements DeptLogService {
@Autowired
private DeptLogMapper deptLogMapper;
DAO层:注意此处一般使用@Mapper注解,这个注解是mabitas提供的(后续会讲到),上面的@Controller注解等是springboot提供的,功能本质上一致。通过加入@Mapper注解将DAO层的对象创建与管理交给IOC容器,这样Service层就可以从IOC容器中获取此类对象。
@Mapper
public interface DeptLogMapper {
通过以上注解即可实现控制反转与依赖注入。