IOC-DI(分层解耦)

问题-引出

可以发现我们之前的代码但是写在我们的controller程序中
这里因为比较简单
但是如果我们开发一个比较复杂的功能的话-会出现大量操作数据的代码
导致代码的复用性较差
且难以维护
在这里插入图片描述

分层解耦

在这里插入图片描述

三层架构

在这里插入图片描述
按照上面的对应代码不同功能
来分为下面这三个架构
对应的controller和service和dao在不同的类里面便于维护和纠错
dao负责第一部分的数据访问
service负责第二部分逻辑处理
最后controller负责我们的发送响应和接收请求
在这里插入图片描述
但是其实我们dao接收的数据
可能来自xml文件或者数据库,或者别人给的一个接口
所以编写Dao之前先要编写一个Dao的接口

在这里插入图片描述

对应实现
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

解耦-相关概念

在这里插入图片描述
可以发现我们在对应的service和controller都创建了别的对象
那么以后我们要换service的实现
那么controller里面的代码也要变,三层的代码耦合在了一起
我们希望他们是内聚的怎么解决呢?

在这里插入图片描述
肯定要把new的操作删除
但是怎么获取对象呢
我们可以弄一个容器,如果controller需要的话
就从对应的容器取service对象
涉及两个问题
1.对象怎么让容器管理-IOC
2.容器怎么提供给controller所依赖的资源-DI

这里就涉及到IOC(控制反转)和DI(依赖注入)
在这里插入图片描述

IOC和DI入门(技术更新-看详解)

1.在service和dao类上
加上注解
@Component
表示把这个类交给IOC容器处理
完成控制反转操作
2.为controller和service注入依赖
需要在对应的成员变量是哪个加上注解
@AutoWired
完成依赖注入的操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

此时我们想切换实现比如ServiceA切换到ServiceB
只需要将A实现类上面的@Component注释掉
在B上加@Component
(当然这样肯定不是最新技术,下面会有新的讲解)
在这里插入图片描述

IOC详解

在这里插入图片描述

IOC(控制反转)
IOC容器内的对象都称为Bean对象(被IOC管理)
然后@Component是最底层的
spring中为了更好标识web开发中到底属于那一层
提供了对应@Component的衍生注解
@Controller(Controller),@Service(Service),@Repository(DAO)
在这里插入图片描述

@Compontent的衍生注解

@Compontent可以注释那种,不属于三层架构,但是想把他交给IOC容器管理的,典型的就是一些工具类
所以原来的代码可以改成
Controller注解
@RestController包含了@Controlller也就包含了@Compontent
在这里插入图片描述
service
在这里插入图片描述
DAO
在这里插入图片描述

其实@Controller,@Service,@Repository
都只封装了一个注解就是@Compontent
在这里插入图片描述
那些target,Retention和documented都是源注解

Bean的名字

默认如果你什么都不写的话
就是对应的类的首字母小写比如

在这里插入图片描述
在这里插入图片描述
但如果你想自己指定就这样,对应的名称会改(一般都是不该的)
在这里插入图片描述
在这里插入图片描述

Bean的组件扫描

在这里插入图片描述
在这里插入图片描述
可以看到启动类对应的注解包含了@ComponentScan就这个扫描器的
就是你的对应的注解要在和启动类在同一个包或者其子包下,才可以被扫描到
像这样的
在这里插入图片描述
我们的启动类则是在com.itheima下
在这里插入图片描述
所以检测不到外面的,会报错
解决方法
1.多写个注解@ComponentScan({“dao”,“com.itheima”})不推荐
这样的话bean不止会扫描com.itheima包下的,也会扫描dao包下的bean对象
在这里插入图片描述
2. 把包放规范一点
全放到启动类所在包的子包,就行
在这里插入图片描述

DI详解

在这里插入图片描述

@AutoWired
就自动装配,默认是按照类型装配的在这里插入图片描述

但是会出现一个问题EmpService是个接口,对应有两个实现EmpServiceA和EmpServiceB
对应如果EmpServiceA和EmpServiceB都宿舍Bean对象,就会报错(不知道选哪个)
在这里插入图片描述

解决方案
在这里插入图片描述
1.@Primary
优先呗
你加到EmpServiceA上A就优先生效
你加到EmpServiceB上B就优先生效
2.@Qualifier
用这个注解来指定我们需要用的Bean对象
放在@AutoWired头上
@Qualifier(“Bean对象名”)
在这里插入图片描述
3.@Resource
把@AutoWired替换成@Resource
autowired默认按类型注入
resource按Bean名称注入
有点类似第二种的组合
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值