web第八次课后作业--分层解耦
一、分层
- Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
- Service:业务逻辑层。处理具体的业务逻辑。
- Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。
二、解耦
可是这三层之间的耦合度太高,牵一发而动全身
我们的解决思路是:
提供一个容器,容器中存储一些对象(例:EmpService 对象)
controller 程序从容器中获取 EmpService 类型的对象
我们想要实现上述解耦操作,就涉及到 Spring 中的两个核心概念:
-
控制反转: Inversion Of Control,简称 IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC 容器或 Spring 容器 -
依赖注入: Dependency Injection,简称 DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。(通常在Service和Controller层)
- Controller 程序中注入依赖的 Service 层对象
- Service 程序中注入依赖的 Dao 层对象
例:EmpController 程序运行时需要 EmpService 对象,Spring 容器就为其提供并注入 EmpService 对象。
- IOC 容器中创建、管理的对象,称之为:
bean 对象
。 - 在 IOC 容器中,每一个 Bean 都有一个属于自己的名字,可以通过注解的 value 属性指定 bean 的名字。如果没有指定,默认为类名首字母小写。
那如果在 IOC 容器中,存在多个相同类型的 bean 对象,会出现什么情况呢?
Spring 提供了以下几种解决方案:
1. @Primary
当存在多个相同类型的 Bean 注入时,加上@Primary 注解,来确定默认优先注入。
2. @Qualifier
- 指定当前要注入的 bean 对象。 在@Qualifier 的 value 属性中,指定注入的 bean 的名称。
- @Qualifier 注解不能单独使用,必须配合@Autowired 使用
3. @Resource
是按照 bean 的名称进行注入。通过 name 属性指定要注入的 bean 的名称。
@Autowird 与 @Resource 的区别
- @Autowired 是 spring 框架提供的注解,而@Resource 是 JDK 提供的注解
- @Autowired 默认是按照类型注入,而@Resource 是按照名称注入
三、结果展示