当前位置: 首页 > backend >正文

Spring IoCDI

Spring 是什么?

Spring是⼀个开源框架, 他让我们的开发更加简单.

Spring 是包含了众多⼯具⽅法的 IoC 容器

什么是IoC?

IoC控制反转

IoC 是Spring的核⼼思想

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

IoC是解耦合的

IoC容器具备以下优点:

资源不由使⽤资源的双⽅管理,⽽由不使⽤资源的第三⽅管理,这可以带来很多好处。第⼀,资源集中管理,实现资源的可配置和易管理。第⼆,降低了使⽤资源双⽅的依赖程度,也就是我们说的耦合度。

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

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

IoC的五大注解

加五大注解代表着是被Spring管理,相当于Spring内部直接创建了一个对象

@Controller、@Component、@Service、@Configuration、@Repository

如何读bean呢?

Application和BeanFeactory关系及区别?

1、父子关系,Application是字,BeanFeactory是夫,BeanFeactory有的功能,Application都有,除此之外,Application还有环境、资源管理等功能。

2、性能上:

Application是提前加载,浪费空间,性能好

BeanFeactory是懒加载,节约空间,性能比Application低

五大注解能否被混用?

1、功能上,部分可以混用。(Controller是不可以被混用的)

2、规范上,不可以被混用。

程序被Spring管理,需要有:

1、被Spring扫描到(默认扫描的路径是启动类所在目录)

2、需要配置五大注解和@bean使用

也可以使用@ComponentScan(basePackages = "路径")修改扫描路径

@Bean方法

 使用@Bean时,必须要搭配五大注解使用。

@Bean 常用于集成无法修改源码的第三方类库

DI(依赖注入)

IoC 是⼀种思想,也是"⽬标", ⽽思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI 就属于具体的实现。所以也可以说, DI 是IoC的⼀种实现.

1、属性注入

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中.

2、构造方法注入

构造⽅法注⼊是在类的构造⽅法中实现注⼊

注意:

1、只有一个构造函数,不需要加@Autowired

2、如果有多个构造函数,要加@Autowired指定,没有指定就默认使用无参的

构造函数规范

如果添加构造函数,把无参构造函数也添加,使用谁,谁加@Autowired

Setter注入

Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注


三种注入优缺点分析

属性注⼊

优点: 简洁,使⽤⽅便;

缺点:

  1. 只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指 针异常)
  2. 不能注⼊⼀个Final修饰的属性、

构造函数注⼊(Spring 4.X推荐)

优点:

  1. 可以注⼊final修饰的属性
  2. 注⼊的对象不会被修改
  3. 依赖对象在使⽤前⼀定会被完全初始化,因为依赖是在类的构造⽅法中执⾏的,⽽构造⽅法 是在类加载阶段就会执⾏的⽅法.
  4. 通⽤性好, 构造⽅法是JDK⽀持的, 所以更换任何框架,他都是适⽤的

缺点:

注⼊多个对象时, 代码会⽐较繁琐

Setter注⼊(Spring 3.X推荐)

优点: ⽅便在类实例之后, 重新对该对象进⾏配置或者注⼊

缺点:

  1. 不能注⼊⼀个Final修饰的属性
  2. 注⼊对象可能会被改变, 因为setter⽅法可能会被多次调⽤, 就有被修改的⻛险
http://www.xdnf.cn/news/5621.html

相关文章:

  • matlab simulink双边反激式变压器锂离子电池均衡系统,双目标均衡策略,仿真模型,提高均衡速度38%
  • 大语言模型训练的两个阶段
  • 神经网络是如何工作的
  • Linux 文件权限管理
  • 【Leetcode】系列之206反转链表
  • 工具篇-如何在Github Copilot中使用MCP服务?
  • 进程相关面试题20道
  • Python中操作Neo4j图数据库
  • JMV 优化过程是什么?有什么效果?为什么要升级垃圾收集器?
  • 数据结构与算法——单链表01
  • Spark处理过程-转换算子和行动算子(四)
  • React 播客专栏 Vol.9|React + TypeScript 项目该怎么起步?从 CRA 到配置全流程
  • 图形化编程如何从工具迭代到生态重构?
  • HAProxy + Keepalived + Nginx 高可用负载均衡系统
  • NVIDIA Quantum-2 QM9700系列利用400G infinniband扩展数据中心智能开关
  • 高并发场景下的BI架构设计:衡石分布式查询引擎与缓存分级策略
  • MySQL 分页查询优化
  • ultralytics框架计算大中小目标检测精度
  • uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
  • matlab 读取数字高程模型DEM并可视化
  • 进程和线程
  • Node和npm初学
  • HTTPS全解析:从证书签发到TLS握手优化
  • 算法-单调栈
  • 【Linux笔记】——进程信号的产生
  • arduinoIDE核心库更新导致的ESP32开发板神秘接口更换和三方库冲突
  • 解锁性能密码:Linux 环境下 Oracle 大页配置全攻略​
  • uniapp引入七鱼客服微信小程序SDK
  • 【氮化镓】横向GaN 器件注入隔离区的电场相关载流子传输特性
  • 让 - 艾里克・德布尔与斯普林格出版公司:科技变革下的出版业探索