Spring IoC&DI

一. IoC & DI 入门

IoC

IoC是Spring的核心思想

在类上添加 @RestController 和 @Controller 注解,就是把这个对象交给Spring管理,Spring框架启动时就会加载该类,把对象交给Spring管理,就是Loc思想

IoC:Inversion of Control(控制反转),也就是说Spring是一个"控制反转"的容器

什么是控制反转呢? 也就是控制权反转.

什么的控制权发⽣了反转?

获得依赖对象的过程被反转了 也就是说,当需要某个对象时,传统开发模式中需要⾃⼰通过new创建对象,现在不需要再进⾏创 建, 把创建对象的任务交给容器, 程序中只需要依赖注⼊(DependencyInjection,DI)就可以了. 这个容器称为:IoC容器. Spring是⼀个IoC容器,所以有时Spring也称为Spring容器

IoC优点:

资源不由使用资源的双方管理,而是由不使用资源的第三方管理

1.资源集中管理:Loc容器会帮我们管理一些资源(对象等),我们需要使用时,只需要从IoC容器中取就可以了

2.我们在创建实例的时候不需要了解其中的细节,降低了使用资源双方的依赖程度,也就是耦合度

DI

DI (Dependency Injection) 依赖注入

IoC是一种思想,也是"目标",而思想只是一种指导原则,最终还是要有可行的落地方案,而DI就属于具体的视线,所以也可以说,DI是IoC的一种实现

二. IoC & DI 实现

三. IoC详解

前面所提到的IoC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象,也就是bean的存储

Bean的存储

要把某个对象交给IOC容器管理,需要在类上添加注解

共有两类注解可以实现:

类注解:@Controller @Service @Repository @Component @Configuration

方法注解:@Bean


@Controller(控制器存储)

ApplicationContext 翻译过来就是:Spring上下文

因为对象都交给Spring管理了,所以获取对象要从Spring中获取,那么就得先得到Spring的上下文

如果将 @Controller 去掉

获取bean对象的其他方法

ApplicationContext 也提供了其他获取bean的方式

,ApplicationContext获取bean对象的功能,是父类BeanFactory提供的功能

Bean命名约定:Bean Overview :: Spring Framework(官方文档)

可以定义Bean名字

这三种方法得到对象是同一个,地址是一样的

ApplicationContext VS BeanFactory(常见面试题)

  • 继承关系和功能方面说:Spring容器有两个顶级的接口:BeanFactory和ApplicationContext。其中BeanFactory提供了基础的访问容器的功能,而ApplicationContext属于BeanFactory的子类,继承其功能,还具有独特的特性,还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持
  • 从性能方面来说:ApplicationContext是一次性加载并初始化所有的Bean对象,而BeanFactory是需要哪个才去加载,因此更轻量

@Service(服务存储)


@Repository(仓库存储)


@Component(组件存储)


@Configuration(配置存储)

为什么使用这么多注释

与应用分层相呼应

@Controller:控制层,接收请求,对请求进行处理,并进行响应

@Service:业务逻辑层,处理具体的业务逻辑

@Repository:数据访问层,也成为持久层,负责数据访问操作

@Configuration:配置层,处理项目中的一些配置信息

程序应用分层,调用流程如下:

这些注解里面都有⼀个注解 @Component ,说明它们本⾝就是属于 @Component 的"子类". @Component 是⼀个元注解,也就是说可以注解其他类注解,如 @Repository 等.这些注解被称为 @Component 的衍生注解

方法注解@Bean

类注解是添加在某个类上的,但是存在两个问题

1.使用外包装类,没办法添加类注解

2.一个类,需要多个对象,比如多个数据源

这种场景就需要使用方法注解 @Bean

方法注解要配合类注解使用

可以根据名称来获取

继续使用s1

Spring会从Spring容器中,查找String类型的对象,赋值给name

扫描路径

使用五大注解声明的bean,要想生效,还需要配置扫描路径,让Spring扫描到这些注解 也就是通过 @ComponentScan 来配置扫描路径.

默认扫描的范围是SpringBoot启动类所在包及其子包

把启动类放在我们希望扫描的包的路径下,这样我们定义的bean就都可以被扫描

四. DI详解

依赖注入是一个过程,实质IOC容器在创建Bean时,去提供运行时所依赖的资源,而资源指的就是对象,简单来说,就是把对象取出来放到某个类的属性中

关于依赖注入,Spring提供了三种方式:

1.属性注入

2.构造方法注入

3.Setter注入

属性注入

属性注入使用 @Autowired 实现的,将Service类注入到Controller类中

构造方法注入

如果类只有一个构造方法,那么@Autowired 注解可以省略,如果类中有过个构造方法,默认使用无参数的构造方法,需要添加 @Autowired 来明确使用哪个构造方法

Setter 注入

三种注入优缺点分析

1.属性注入

优点:

  • 简介,使用方便

缺点:

  • 只适用于IoC容器
  • 不能注入final修饰的属性

2.构造函数注入

优点:

  • 可以注入final修饰的属性
  • 注入的对象不会被修改
  • 依赖对象在使用前一定会被初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段会被执行的
  • 通用性好,构造方法时JDK提供的没所以更换任何框架都是适用 的

缺点:

  • 注入多个对象时,代码会比较繁琐

3.Setter注入

优点:

  • 方便在类实例之后,重新对对象进行配置或者注入

缺点:

  • 不能注入Final修饰的属性
  • 注入对象可能会被改变,因为Setter方法可能会被多次调用,就有修改的风险

@Autowired存在的问题

当同一类型存在多个bean时,就会出现问题

为了解决以上问题,Spring提供了

1.@Primary

2.@Qualifer

3.@Resource

使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现.

使⽤@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean 的名称

@Qualifier注解不能单独使⽤,必须配合@Autowired使⽤

使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称

常见面试题

@Autowired 和 @Resource 的区别

@Autowired是Spring框架提供的注解,@Resource 是JDK提供的注解

@Autowired默认是按照类型注入,@Resource默认是按照名称注入

相⽐于@Autowired 来说, @Resource ⽀持更多的参数设置,例如name设置,根据名称获取Bean

五. 总结

1.Spring ,Spring Boot 和Spring MVC的关系及区别

Spring:简单来说,Spring是一个开发应用框架,什么样的框架呢,有怎么几个标签:轻量级、一站式、模块化,其目的是用于简化企业级应用程序的开发

Spring MVC:是Spring的一个子框架,Spring诞生之后,按照MVC模式设计了一个MVC框架,主要用于开发Web应用和网络接口,所以Spring MVC是一个Web框架

Spring Boot:是对Spring的一个封装,为了简化Spring赢用的开发而出现的,可以快速搭建框架,降低开发成本,无需关注XML的配置和一些底层实现

最后一句话总结:Spring MVC 和Spring Boot 都属于Spring,Spring MVC是基于Spring的一个MVC框架,Spring Boot 是基于Spring的一套快速开发整合包

2.Bean命名

3.常见面试题

相关推荐
один but you1 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
是码龙不是码农2 小时前
ThreadPoolExecutor 7 个核心参数详解
java·线程池·threadpool
Muscleheng2 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql
这是程序猿2 小时前
Spring Boot自动配置详解
java·大数据·前端
MY_TEUCK2 小时前
【Java 后端 | Nacos 注册中心】微服务治理原理、选型与注册发现实战
java·开发语言·微服务
罗超驿3 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试
jran-3 小时前
Redis 命令
数据库·redis·缓存
小江的记录本3 小时前
【Java基础】Java 8-21新特性:JDK21 LTS:虚拟线程、模式匹配switch、结构化并发、序列集合(附《思维导图》+《面试高频考点清单》)
java·数据库·python·mysql·spring·面试·maven
June`4 小时前
多线程redis下如何解决aof重写和rdb持久化的数据一致性问题
数据库·redis·缓存