文章目录
- 1. 什么是 Spring
- 2. 什么是 IoC
- 3. 什么是 DI
- 4. IoC & DI 使用
- 5. 获取 Bean 的方式
- 5.1 根据类型获取 bean
- 5.2 根据名称获取 bean
- 5.3 获取bean对象的其他方式
- 5.4 五大注解的关联
- 6. 方法注解
- 7. 扫描路径
- 8. Bean 的名称
- 9. DI 详解
- 9.1 属性注入
- 9.2 构造方法注入
- 9.3 Setter方法注入
- 9.4 三种注入优缺点分析
- 9.5 @Autowired存在问题
- 9.5.1 @Primary
- 9.5.2 @Qualifier
- 9.5.3 @Resource
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 使用
对象的管理:
- 存对象:@Component
- 取对象:@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 的名称
- 五大注解
类名首字母小写,如果前两位字母均为大写,则为原类名
也可以指定Bean的名称 指定方法: @Controller(“beanName”) - @Bean
默认名称:方法名
也可以指定名称 @Bean(“beanName”)
使用场景
- 五大注解 自己开发的程序
- @Bean
- 存储第三方的对象(代码不在自己的项目中)
- 一个类型需要创建多个对象时
9. DI 详解
依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运行时所依赖的资源,⽽资源指的就是对象
简单来说,就是把对象取出来放到某个类的属性中
关于依赖注⼊,Spring也给我们提供了三种方式:
- 属性注⼊(Field Injection)
@Autowired - 构造方法注⼊(Constructor Injection)
- 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 修饰的属性,有一个要求,需要满足一下任意条件
- 声明时,完成初始化
- 在构造函数中进行赋值
9.5 @Autowired存在问题
同样类型,存在多个对象时,会发生报错
Autowired 会先根据名称来获取,如果获取到了,就正常响应
如果没有获取到,就根基类型匹配,此时,如果匹配到多个,就会报错
通常做法:不使用变量名称来指定获取某个 bean,而是通过其他的手段来指定 bean 的名称
通常我们会认为变量名的修改不影响我们的业务逻辑处理