【JavaEESpring】Spring IoCDI

news2024/12/25 9:20:02

Spring IoC& DI

  • 1. IoC
  • 2. IoC & DI 使⽤
    • 2.1 Bean的存储
    • 2.1 DI 注入 @Autowired
  • 3. 练习代码自取

1. IoC

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

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

  • 什么是控制反转呢? 也就是控制权反转; 什么的控制权发生了反转? 获取依赖对象的过程被反转了
  • 也就是说, 当需要某个对象时, 传统开发模式中需要自己通过 new 创建对象, 现在不需要再进行创建, 把创建对象的任务交给容器, 程序中需要依赖注入 (Dependency Injection, DI) 就可以了
  • 这个容器称为; IoC 容器, Spring 是一个IoC 容器, 所以有时Spring也称为 Spring 容器

DI 介绍

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

2. IoC & DI 使⽤

Spring 把存储在容器中的对象称为 bean

2.1 Bean的存储

两种类型的注解

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration
  2. ⽅法注解:@Bean

bean 的命名规则

  • bean名称以⼩写字⺟开头,然后使⽤驼峰式⼤⼩写.
  • 当有多个字符并且第⼀个和第⼆个字符都是⼤写时, 将保留原始的⼤⼩写

bean 的获取

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

为什么要这么多类注解?

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

在这里插入图片描述

方法注解 @Bean

只使用类注解, 存在两个问题:

  1. 使⽤外部包⾥的类, 没办法添加类注解
  2. ⼀个类, 需要多个对象, ⽐如多个数据源

这种场景, 我们就需要使⽤⽅法注解 @Bean

注意:

  • ⽅法注解要配合类注解使⽤
  • 注解@Bean存的对象类型是方法返回的类型, 命名是方法名字
  • @Bean 可以进行重命名
  • @ComponentScan 指定 Spring 扫描的路径, 默认扫描的范围是SpringBoot启动类所在包及其⼦包

2.1 DI 注入 @Autowired

三种方法

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

三种注⼊优缺点分析

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

@Autowired存在问题

当同⼀类型存在多个bean时, 使⽤@Autowired会存在问题

解决方法:

  • @Primary
    • 使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现。
  • @Qualifier
    • 使⽤@Qualifier注解:指定当前要注⼊的bean对象。 在@Qualifier的value属性中,指定注⼊的bean的名称。
    • @Qualifier注解不能单独使⽤,必须配合@Autowired使⽤
  • @Resource
    • 使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称。

@Autowird 与 @Resource的区别

  • @Autowired 是spring框架提供的注解,⽽@Resource是JDK提供的注解
  • @Autowired 默认是按照类型注⼊,⽽@Resource是按照名称注⼊
  • 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name 设置,根据名称获取 Bean。

3. 练习代码自取

代码提取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1189567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp使用vue

uniapp集成了Vuex,,并不需要安装vuex 定义自己的vuex vuex中独立命名空间: 可以在模块中使用 namespaced 属性,设置为 true,,这样做的好处是,,不同模块之间的state,mut…

电商库存随笔

好多年没有来写东西了,忙成狗,最近闲暇,有点时间,随手写一下之前的项目中的小点; 一方面是做个总结,一方面打发一下时间 出库 库存扣减时机 下单扣减 [生成订单]付款扣减预扣库存(实际使用) 预扣库存 并…

运营商大数据精准获客:我们提供精准客源渠道的最大资源体?

运营商大数据精准营销 谈起精准获客,竞争对手永远是为我们提供精准客源渠道的最大资源体! 最新的获客方式,就是从竞争对手的手中把他们的精准客户资源变为自己的。 今年最火的运营商大数据精准营销是拒绝传统营销方式的烧钱推广&#xff0…

Nginx缓存基础

1 nginx缓存的流程 客户端需要访问服务器的数据时,如果都直接向服务器发送请求,服务器接收过多的请求,压力会比较大,也比较耗时;而如果在nginx缓存一定的数据,使客户端向基于nginx的代理服务器发送请求&…

ChatGPT - 在ChatGPT中设置通用提示模板

文章目录 Prompt设置验证 Prompt VERBOSITY: 我可能会使用 V[0-3] 来定义代码的详细程度:V0 简洁明了 V1 简练 V2 详细 V3 非常详细,附有例子助理回应 您是用户问题背景下的主题专家。我们一步一步来:除非您只是回答一个简短的问题&#xff…

Confluence 漏洞复现(CVE-2023-22515)

Confluence 漏洞复现(CVE-2023-22515,CVE-2023-22518) 1.CVE-2023-22515权限提升漏洞 1.1漏洞描述 Confluence近期推出的严重漏洞cve-2023-22515,由于未授权和xwork框架问题,导致攻击者可以未授权将系统设置为未安装…

分布式事务的华丽进化

说到分布式事务,大家并不陌生。之前我已做过相关的总结(连接附本文后面),不过比较偏理论。在实际工作中,用得比较多的还是柔性分布式事务,今天主要把在工作中运用到的几种柔性分布式事务的场景及实现方式做…

使用nginx作为图片服务器

第一步: 下载nginx版本,去官网下载,这里不建议下载最新版本,因为有时候最新版本还不太稳定。 nginx下载地址官网:nginx: download,然后把下载好的安装包解压出来。 第二步: 在nginx目录下载创建…

在新的服务器上成功安装mysqlclient的方法【解决No matching distribution found for mysqlclient的问题】

前言:在某台Centos服务器上安装mysqlclient时一直报下面的错: WARNING: Discarding https://mirrors.aliyun.com/pypi/packages/6a/91/bdfe808fb5dc99a5f65833b370818161b77ef6d1e19b488e4c146ab615aa/mysqlclient-1.3.0.tar.gz#sha25606eb5664e3738b28…

【2】Spring Boot 3 项目搭建

目录 【2】Spring Boot 3 初始项目搭建项目生成1. 使用IDEA商业版创建2. 使用官方start脚手架创建 配置与启动Git版本控制 个人主页: 【⭐️个人主页】 需要您的【💖 点赞关注】支持 💯 【2】Spring Boot 3 初始项目搭建 项目生成 1. 使用IDEA商业版创…

[sd_scripts]之config

https://github.com/kohya-ss/sd-scripts/blob/main/docs/config_README-ja.mdhttps://github.com/kohya-ss/sd-scripts/blob/main/docs/config_README-ja.md[Stable Diffusion]训练你的LoRA(Linux) - 知乎简介LoRA 是一种参数高效微调方法(PEFT)&#x…

原型链污染漏洞

想要很清楚了理解原型链污染我们首先必须要弄清楚原型链这个概念 可以看这篇文章:对象的继承和原型链 目录 prototype和__proto__分别是什么? 原型链继承 原型链污染是什么 哪些情况下原型链会被污染? 例题1:Code-Breaking 2…

软件测试|PO设计模式在 UI 自动化中的实践

PO的思想最早是2013年由IT大佬Martin Flower提出的:https://martinfowler.com/bliki/PageObject.html 没错,就是他 — 没错,就是他 — 在他的文章里有这样一张经典样图,图片中展示了测试代码中直接操作HTML元素和使用PO模式将page对象封装成…

Android JVM内存模型——老生常谈

jvm简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 jvm作用 Java中的所有类,必须…

Web自动化测试入门篇详解

一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持&…

阿里云e实例服务器3M固定带宽40G ESSD entry系统盘99元/年

阿里云99元服务器新老用户均可以买,你没看错,老用户可以买,活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘,并且续费不涨价,原价99元即可续费&#xff0c…

阿里云99元服务器40G ESSD Entry云盘、2核2G3M带宽配置

阿里云99元服务器新老用户均可以买,你没看错,老用户可以买,活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘,并且续费不涨价,原价99元即可续费&#xff0c…

学之思项目的搭建部署 打jar包失败的解决方法

学之思系统介绍部署java环境安装maven安装node.js前端打包工具命令npmGit命令获取源代码安装配置mysql前端打包打包jar包服务上线!!!打jar包失败的解决方法 学之思系统介绍 学之思开源考试系统是一款 java vue 的前后端不分离的考试系统。主要优点是开发、部署简单快捷、界面…

咖啡机、电热水壶、豆浆机上架亚马逊美国站UL1082认证标准

咖啡机、电热水壶、豆浆机UL1082报告亚马逊美国站,UL1082标准是指室内用的,咖啡机、电热水壶、豆浆机以及滴落式类加热产品的标准。UL标准是美国的检测标准,目前跨境电商亚马逊美国站需要商家提供产品的UL报告,其中UL1082报告就是…

centos配置docker环境

CentOS系统更换软件安装源 yum默认链接的还是国外的镜像,速度相对不理想,配置成国内的镜像会快很多,这里以阿里镜像为例进行配置: 首先进行更新: yum updatebase源 第一步:备份你的原镜像文件,以免出错后…