分层解耦
# 1. 三层架构
① Controller:控制层
,接收前端发送的请求,对请求进行处理,并响应数据
② Service:业务逻辑层
,处理具体的业务逻辑
③ Dao:数据访问层
,负责数据访问操作(增删改查)
按照三层架构的思想,对业务逻辑(Service层)进行变更,不会影响到Controller层和Dao层
# 2. 分层解耦
软件设计原则:高内聚低耦合
高内聚指的是:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即 "高内聚"。
低耦合指的是:软件中各个层、模块之间的依赖关联程序越低越好。
💡为了实现分层解耦,需要借助控制反转和依赖注入
控制反转: Inversion Of Control,简称IOC。
对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器
依赖注入: Dependency Injection,简称DI。
容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。程序运行时需要某个资源,此时容器就为其提供这个资源。
例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象
💡IOC容器中创建、管理的对象,称之为:bean对象
# 3. IOC & DI
# 3.1 解耦概述
通过下方两个注解实现解耦过程
- @Component : 将当前对象交给IOC容器管理,成为IOC容器的bean
- @Autowired : 运行时,从IOC容器中获取该类型对象,赋值给该变量
# 3.2 IOC详解
💡Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属哪一层,提供了@Component的衍生注解:
💡注解中可以指定value
属性指定生成bean对象的名字,默认为类名首字母小写
提示
- 使用四大注解声明的bean,要想生效,还需要被组件扫描注解@ComponentScan扫描
- @ComponentScan注解虽然没有显式配置,但是实际上已经包含在了引导类声明注解 @SpringBootApplication 中,默认扫描的范围是SpringBoot启动类所在包及其子包。
# 3.3 DI详解
@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作),当出现多个相同类型则会报错
解决方案
:
① 使用@Primary注解:当存在多个相同类型的Bean注入时,在定义类前加上@Primary注解,来确定默认的实现;
② 使用@Qualifier注解:在声明对象时使用,在value
属性中,指定注入的bean的名称;必须要与@Autowired一起使用
③ 使用@Resource注解:在声明对象时使用,通过name
属性指定要注入的bean的名称,可以单独使用
面试题 : @Autowird 与 @Resource的区别
- @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
- @Autowired 默认是按照类型注入,而@Resource是按照名称注入