Spring IoC 和 DI

1. 什么是 Spring

Spring:是一个开源框架
SpringBoot:可以添加各种依赖,简化开发
SpringMVC:是一种进行web开发的框架(模块)

Spring相当于一个火车,SpringBoot相当于1230,SpringMVC 相当于里面的功能(买票、改签)


Spring 是包含众多工具的 IoC 容器
(比如 tomcat 就是一个 web 容器,list/map 是数据容器)
Spring 容器,装的是对象

2. 什么是 IoC

IoC 是控制反转
就是把对象的控制权交给了 Spring 进行控制
也是一个获取依赖对象的权利的过程


传统方式造车:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


IoC程序开发
在这里插入图片描述
在这里插入图片描述

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

3. 什么是 DI

DI: Dependency Injection(依赖注⼊)
容器在运⾏期间,动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊

4. IoC & DI 使用

对象的管理:

  1. 存对象:@Component
  2. 取对象:@Autowired

5. 获取 Bean 的方式

Spring 管理的对象都称为 bean

启动类
在这里插入图片描述

5.1 根据类型获取 bean

在这里插入图片描述
在这里插入图片描述
不适合 一个类型对应多个 Bean 对象

5.2 根据名称获取 bean

Spring 帮我们创建对象的时候,会给每一个对象起一个名字

bean 的名称是小驼峰

在这里插入图片描述

在这里插入图片描述

5.3 获取bean对象的其他方式

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

5.4 五大注解的关联

但从功能上来看,除了 Controller,其他效果是一样的
Controller,除了具备让 Spring 管理的功能外,接口的入口,必须为@Controller

五大注解,从概念上还被赋予了别的含义

• Controller:控制层。接收前端发送的请求,对请求进⾏处理,并响应数据
• Service:业务逻辑层。处理具体的业务逻辑
• Dao:数据访问层,也称为持久层。负责数据访问操作,包括数据的增、删、改、查

@Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应
@Servie:业务逻辑层, 处理具体的业务逻辑
@Repository:数据访问层,也称为持久层,负责数据访问操作
@Configuration:配置层,处理项目中的⼀些配置信息


其他的是个注解是 @Component 的衍生类
在这里插入图片描述

6. 方法注解

@Bean
在这里插入图片描述
在这里插入图片描述
@Bean 需要搭配五大注解一起使用

7. 扫描路径

spring 默认扫描路径是 启动类的所在路径

五大注解必须在 spring 扫描路径下,才生效
在这里插入图片描述
通过这个注解来指定Spring的扫描路径
注解默认值是 被该注解标识的类 的所在路径

8. Bean 的名称

Bean 的名称

  1. 五大注解
    类名首字母小写,如果前两位字母均为大写,则为原类名
    也可以指定Bean的名称 指定方法: @Controller(“beanName”)
  2. @Bean
    默认名称:方法名
    也可以指定名称 @Bean(“beanName”)

使用场景

  1. 五大注解 自己开发的程序
  2. @Bean
  1. 存储第三方的对象(代码不在自己的项目中)
  2. 一个类型需要创建多个对象时

9. DI 详解

依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运行时所依赖的资源,⽽资源指的就是对象

简单来说,就是把对象取出来放到某个类的属性中

关于依赖注⼊,Spring也给我们提供了三种方式:

  1. 属性注⼊(Field Injection)
    @Autowired
  2. 构造方法注⼊(Constructor Injection)
  3. Setter 注⼊(Setter Injection)

9.1 属性注入

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

9.2 构造方法注入

在这里插入图片描述
当只有一个构造函数的时候,Spring 会知道使用哪个
当有多个构造函数的时候,优先使用默认的无参的构造函数,如果没有这个构造函数,Spring 会报错
在这里插入图片描述
可以通过 @Autowired 指定构造函数
在这里插入图片描述

9.3 Setter方法注入

在这里插入图片描述

9.4 三种注入优缺点分析

  • 属性注入:
    **优点:**简洁,使用方便
    缺点:
    1.只能⽤于 IoC 容器,如果是非 IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)
    2.不能注⼊⼀个Final修饰的属性
  • 构造函数注入(Spring 4.X推荐)
    优点:
    1.可以注⼊ final 修饰的属性
    2.注⼊的对象不会被修改
    3.依赖对象在使用前⼀定会被完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段就会执行的方法
    4.通用性好,构造方法是JDK⽀持的,所以更换任何框架,他都是适用的
    缺点:
    注⼊多个对象时,代码会比较繁琐
  • Setter注⼊(Spring 3.X推荐)
    优点:
    ⽅便在类实例之后,重新对该对象进⾏配置或者注⼊
    缺点:
    1.不能注⼊⼀个Final修饰的属性
    2.注⼊对象可能会被改变,因为setter⽅法可能

final 修饰的属性,有一个要求,需要满足一下任意条件

  1. 声明时,完成初始化
  2. 在构造函数中进行赋值

9.5 @Autowired存在问题

在这里插入图片描述
同样类型,存在多个对象时,会发生报错

在这里插入图片描述
Autowired 会先根据名称来获取,如果获取到了,就正常响应
如果没有获取到,就根基类型匹配,此时,如果匹配到多个,就会报错

通常做法:不使用变量名称来指定获取某个 bean,而是通过其他的手段来指定 bean 的名称
通常我们会认为变量名的修改不影响我们的业务逻辑处理

9.5.1 @Primary

在这里插入图片描述

9.5.2 @Qualifier

在这里插入图片描述

9.5.3 @Resource

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柒柒要开心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值