依赖注入的几种方式

2023-11-08

获取bean对象,也称为对象装配,对象注入,依赖注入。

对象装配的实现方法有3种:

1.属性注入;

2.构造方法注入;

3.Setter注入。

再讲本节内容之前,我们先来提两个传参的方式,首先呢,上节的文章里边,我们提到了五大类注解和@Bean注解,@Bean注解式可以传参的,他的方式就是:

 

 这就是@bean的传参,很简单,但是有几个需要注意的点:
1.@bean传参的时候记得给配置参数的方法也要加上@bean注解,一定要加上,否则会报错;

2.取参的时候注意取参的方式,我们上节给大家讲了常用的三种取参的方式,那么要记得在取参的时候,第二种根据类名取参的方法,在类里边的对象只能有一个,超过一个的就要根据id取参了,就要用一三的方式了,(一二三的方式是什么就不在这里赘述了,有兴趣的可以去看博主的上一篇文章,链接贴在这里:http://t.csdn.cn/FcMZ4

3.还有一个问题就是,大家可以看到上边写了参数匹配的方法,但是是什么样的匹配规则呢?是这样的,匹配的参数首先根据类型匹配,如哦是这个类型只有一个,那么就直接匹配那一个(不管名字是否相同,直接匹配)。若是同样的参数类型有好几个,那么就根据名称来匹配,和要传入的参数的名字一样的就会匹配上。

还有一个传参的方式呢,就是比较经典的了,通过xml的方式来进行传参:

 上边展示的是传入的是属性,下边展示传入对象的时候的操作:

在配置文件中的写入

取的时候是一样得:

上述方式注入属性是否有点复杂呢?的却是,很复杂,所以接下来我们讲简单的方式去实现属性注入。

属性注入

属性注入是通过@Autowired实现的,而且直接在想要注入的内容上边加上注释就可以,不需要关心构造函数什么的。

注意:使用注释的方式的时候一定要把五大类的注释加上,因为对象要注册到spring中才可以

在这里,我们补充一下,Attowired是根据类来找的,那么有多个类的话该怎么匹配呢?

这里呢,和之前我们讲的@bean的方式是一样的,先是匹配类型,如果只有一个对象就直接注入;如果有多个类的话,就根据名称匹配。

构造方法注入

构造方法注入是在类的构造方法中实现注入。

这里有一点要注意,就是当我们有多个构造函数的时候,那么spring不知道要调用哪个,我们需要通过@Autowired注解告诉它使用哪个。

 

setter注入

setter注入和属性的setter方法实现类似,只不过在设置set方法的时候需要加上@Autowired注解,也就是说就是属性注入和setter方法实现的结合。

 以上就是三种依赖注入方式,那么对比一下三种方式:

  • 属性注入(@Autowired注入):

最简单;

但是只能在spring中使用;不能注入一个Final修饰的属性。(final修饰的属性,不是初始化赋值,就是构造函数赋值。)

  • 构造方法注入:

可以注入final修饰的属性;注入的对象不会被修改;依赖对象在使用前一定会被完全初始化,因为依赖实在类的构造方法种执行的,而构造方法实在类加载阶段就会执行的方法;通用性好,构造方法是JDK支持的,任何框架都适用。

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

  • setter注入:

类在实例化之后,可以重新对该对象进行配置或者注入。

不能注入一个final修饰的属性;注入对象可能会被改变,因为setter方法可能会被多次调用,就可能会被修改。

下边介绍另一个注入关键词:Resource

@Resource注入

 那么我们可以看到,@Resource的在诸如方式和@Autowired的注入方式一样,只是注释不同。那么两者有什么区别呢?

@Autowired来自于spring,而@Resource来自于JDK。

使用的时候设置的参数不同,相比较@Autowired来说,@Resource支持更多的参数设置。还记得上边我们讲了@Autowired是根据类型获取bean的,一个类型有多个对象时候则根据名称匹配。@Resource可以根据名称来匹配。

@Resource可以指定查找的名称:

但是上述操作@Autowired不可以。

那么@Autowired遇到这种问题怎么办呢,它提供了别的方法:

搭配一个注解@Qualifier使用。

 上边就是本次介绍的所有内容了,下次再见~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖注入的几种方式 的相关文章

  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • mysql主从配置文件

    主节点配置文件 Copyright c 2017 Oracle and or its affiliates All rights reserved This program is free software you can redistri
  • APK 反编译过程中的几个错误解决方法

    今天在反编译研究个apk的时候在回编译的时候提示如下错误 一 All register args must fit in 4 bits 提示出错的行数的代码是 pre class java invoke virtual v0 p0 v1 L
  • 2021-1-29Linux学习纪要

    删除用户 userdel 用户名 会保留主目录 userdel r 用户名 全部删完 在实际开发中会保留家目录 查询用户信息 id 用户名 当用户不存在 返回 无此用户 切换用户 基本语法 su 切换用户名 创建一个普通用户 指定密码 su
  • docker部署jenkins-slave分布式节点

    docker 运行jenkins slave示例 使用jnlp方式进行连接 即是agent主动连接master docker run jenkins jnlp slave url http jenkins server port workD
  • 计算机组成原理fc和fz,合肥工业大学计算机组成原理实验报告(DOC)

    合肥工业大学计算机组成原理实验报告 DOC 合肥工业大学计算机组成原理 合肥工业大学计算机组成原理试卷 计算机组成原理实验pdf 计算机组成原理微程序 计算机组成原理实验报告 计算机组成原理知识点 计算机组成原理试卷 计算机组成原理 pdf
  • apache出现You don't have permission to access / on this server. 提示

    看看是不是DocumentRoot的值改过了 如果是的话还要再看
  • 【单目标优化算法】孔雀优化算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及详细文章 1 概述 受孔雀群智能行为的启发 POA的设计
  • 数据科学中的数据库简介

    推荐 使用 NSDT场景编辑器 快速搭建3D应用场景 用于高效视频 AI 和图形的通用加速器 数据科学中的数据库简介 数据科学涉及从大量数据中提取价值和见解 以推动业务决策 它还涉及使用历史数据构建预测模型 数据库有助于对如此大量的数据进行
  • 云原生之使用Docker部署wordpress网站

    云原生之使用Docker部署wordpress网站 一 wordpress介绍 二 检查本地docker环境 1 检查docker状态 2 检查docker版本 三 下载wordpress镜像 四 创建数据库 1 创建数据目录 2 创建my
  • 免费AWS EC2实例

    免费日期 2022年12 月 31日前 免费类型 Amazon Linux 2 AMI HVM SSD Volume Type 64 位 ARM 只支持ARM t4g micro 其他平台可用 例如 Ubuntu 18 04 或更新版本 R
  • FreeRTOS临界区

    FreeRTOS临界区是指那些必须完整运行 不能被打断的代码段 比如有的外设的初始化需要严格的时序 初始化过程中不能被打断 FreeRTOS 在进入临界区代码的时候需要关闭中断 当处理完临界区代码以后再打开中断 FreeRTOS 系统本身就
  • 引入springcloud报错。common依赖找不到_引用fabric-sdk和fabric报错 go mod 调试记录

    1 背景介绍 在fabric中 我们将proto定义文件放到fabric protos common路径下 在fabric sdk go中 我们引入的是fabric protos go包 当同时引入的时候 会将相同名称的proto对象注册
  • Swagger怎么做免鉴权

    前言 Swagger在API文档生成及测试方面非常方便 但是很多的API调用都需要用到token验证 然后经过Gateway网关 鉴权验证通过之后访问业务系统 为了方便后端开发自测接口 我们可以免去鉴权吗 答案是可以的 一般鉴权方式 我们先
  • 页面性能优化,如何减少回流

    在开发时 不可避免的会遇到性能优化的问题 怎么做性能才会更好 说到页面性能优化 我们就谈谈两个概念重绘和回流 1 什么是重绘 什么是回流 重绘 当渲染树中的一些元素需要更新属性 而这些属性只是影响元素的外观 风格 而不会影响布局的操作 比如
  • windows搭建WEB打印机

    文章目录 Web Print 添加一台虚拟打印机 名称为 CS Print 发布到AD域 客户端们都能够通过访问 https print www chinaskills com 查看打印机 证书由CSK2021 ROOTCA进行签署颁发 1
  • skywalking和jpa冲突

    1 报错 org springframework security authentication InternalAuthenticationServiceException No MethodInvocation found Check
  • 【C语言】通讯录的动态存储版本

    目录 一 前言 二 为什么要动态存储 1 动态存储的作用 2动态与静态存储的区别 三 动态存储的实现 1 通讯录容量 2 初始化通讯录 3 增加 减少通讯录成员 增加通讯录成员 判断及实现扩容函数的实现 减少通讯录成员 判断及实现减容函数的
  • iOS开发常见错误代码对照表---真机调试常见错误及解决方案

    iOS真机调试常见错误及解决方案 地址https developer apple com library ios technotes tn2250 index html apple ref doc uid DTS40009933 CH1 T
  • 11下滑半个屏幕_看完小米11发布会,2万粉购买小米,雷军给苹果的致命一击

    2020年12月28日 小米11发布会正式召开 这次的小米很聪明很聪慧 让我们看到了对用户满满的诚意 首先就是跑分 对于大部分用户而言 手机的跑分就代表着手机的性能 而小米搭配的高通骁龙888芯片 就让我们有了全新的认知 最终Antutu综
  • 依赖注入的几种方式

    获取bean对象 也称为对象装配 对象注入 依赖注入 对象装配的实现方法有3种 1 属性注入 2 构造方法注入 3 Setter注入 再讲本节内容之前 我们先来提两个传参的方式 首先呢 上节的文章里边 我们提到了五大类注解和 Bean注解