Spring依赖注入的方式

   

目录

1. Setter注入

2. 构造器注入

3. 字段注入

4. 方法注入

5. 接口注入

6. Lookup注入

7. 注解注入


  Spring框架提供了多种依赖注入(DI)的方式来管理对象之间的依赖关系。以下是Spring支持的依赖注入方式:

1. Setter注入

  • 定义:通过类的setter方法注入依赖。
  • 举例
    方式一
    @Component
    public class MyClass {private MyDependency dependency;@Autowiredpublic void setDependency(MyDependency dependency) {this.dependency = dependency;}
    }方式二
    <bean id="myDependency" class="com.example.MyDependency" />
    <bean id="myClass" class="com.example.MyClass"><property name="dependency" ref="myDependency" />
    </bean>

2. 构造器注入

  • 定义:通过类的构造器注入依赖。
  • 举例
    public class MyClass {private MyDependency dependency;public MyClass(MyDependency dependency) {this.dependency = dependency;}
    }方式一
    <bean id="myDependency" class="com.example.MyDependency" />
    <bean id="myClass" class="com.example.MyClass"><constructor-arg ref="myDependency" />
    </bean>方式二
    @Component
    public class MyClass {private MyDependency dependency;@Autowiredpublic MyClass(@Qualifier("dependency")MyDependency dependency) {this.dependency = dependency;}
    }

   注意:1.@Qualifier("dependency") 可以不写,触发有多个dependency
              2.在 Spring 4.3 及以后的版本中,如果这个类只有一个构造方法,那么这个构造方法上面也可以不写 @Autowired 注解。

3. 字段注入

  • 定义:直接在类的字段上使用@Autowired@Inject注解注入依赖。
  • 举例
    @Component
    public class MyClass {@Autowiredprivate MyDependency dependency;
    }

4. 方法注入

  • 定义:通过方法传递依赖,通常与@Bean注解一起使用在配置类中。
  • 举例
    @Configuration
    public class MyConfiguration {@Beanpublic MyDependency myDependency() {return new MyDependency();}@Beanpublic MyClass myClass(MyDependency myDependency) {return new MyClass(myDependency);}
    }

5. 接口注入

  • 定义:通过实现特定的接口来注入依赖,这种方式在Spring中不常见,因为它侵入了代码。
  • 举例
    public class MyClass implements MyDependencyAware {private MyDependency dependency;@Overridepublic void setMyDependency(MyDependency dependency) {this.dependency = dependency;}
    }然后方式一
    <beans><bean id="dependency" class="com.example.MyDependency"/><bean id="myClass" class="com.example.MyClass"><property name="dependency" ref="dependency"/></bean>
    </beans>方式二
    @Configuration
    public class AppConfig {@Beanpublic MyDependency dependency() {return new MyDependency();}@Beanpublic MyClass myClass() {MyClass myClass = new MyClass();myClass.setMyDependency(dependency());return myClass;}
    }

6. Lookup注入

  • 定义:通过查找方法来注入原型作用域的依赖,这在处理单例作用域Bean中注入原型作用域Bean时特别有用。
  • Lookup注入每次调用都会创建一个新的原型bean实例

      当你使用Lookup注入方法时,每次调用这个方法都会向Spring容器请求一个新的原型bean实例。Spring容器负责管理bean的生命周期,包括原型bean的创建。因此,每次Lookup方法被调用时,都会创建一个新的原型bean,并且这个新创建的bean将是一个全新的实例,与之前创建的实例相互独立。这样可以确保每次操作都能使用到一个全新的对象,避免了状态信息的共享和污染

  • 使用场景:在某些情况下,单例bean在运行时可能需要根据不同的条件动态更换其依赖的对象。Lookup注入可以在不重新创建单例bean的情况下,动态地获取新的原型bean实例。
  • 举例
    public abstract class MySingletonBean {public abstract MyPrototypeBean getMyPrototypeBean();public void doSomething() {MyPrototypeBean bean = getMyPrototypeBean();// 使用bean做些事情...}
    }方式一、
    <bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton"><lookup-method name="getMyPrototypeBean" bean="myPrototypeBean"/>
    </bean><bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype"/>方式二@Configuration
    public class AppConfig {@Bean@Scope("singleton")public SingletonBean singletonBean() {return new SingletonBean() {@Lookuppublic PrototypeBean createPrototypeBean() {// 此处实现会被Spring动态覆盖return null;}};}@Bean@Scope("prototype")public PrototypeBean prototypeBean() {return new PrototypeBean();}
    }

7. 注解注入

  • 定义:通过注解来注入依赖,常用的注解有@Autowired@Resource@Value@Inject等。
  • 举例
    @Component
    public class MyClass {@Resource(name = "myDependency")private MyDependency dependency;@@Autowiredprivate MyDependency2 dependency2;@Value("${some.value}")private String value;
    }

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

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

相关文章

ChatGPT4.0直接出图功能上线!神奇一键画,AI让创作更轻松(chatgpt4.0直接出圖)

ChatGPT4.0直接出图功能上线&#xff01;神奇一键画&#xff0c;AI让创作更轻松(chatgpt4.0直接出圖) ChatGPT4.0的核心功能 ChatGPT4.0是OpenAI发布的最新版本的ChatGPT&#xff0c;相较于之前的版本有许多新增的功能和特点。其中最显著的功能是新增了直接出图功能&#xff…

Python打印Linux系统中最常用的linux命令之示例

一、Linux中的~/.bash_history文件说明&#xff1a; 该文件保存了linux系统中运行过的命令的历史。使用该文件来获取命令的列表&#xff0c;并统计命令的执行次数。统计时&#xff0c;只统计命令的名称&#xff0c;以不同参数调用相同的命令也视为同一命令。 二、示例代码&am…

【C语言步行梯】分支语句if...else、switch详谈

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 什么是语句&#xff1f;引入分支语句&am…

GPT的磁盘管理

GPT分区工具&#xff1a;gdisk gdisk gdisk分区 GPT 128个主分区 [rootzutuanxue ~]# gdisk -l /dev/sdc [rootzutuanxue ~]# gdisk -l /dev/sdc 查看sdc信息 GPT fdisk (gdisk) version 1.0.3 ​ Partition table scan:MBR: MBR onlyBSD: not presentAPM: not presentGPT…

Charles-抓包工具的使用

文章目录 Charles简介与安装Charles的简介Charles的安装Charles 安装证书 抓包在PC端抓取HTTPS请求在移动端进行抓包移动端配置Androd端配置iOS端配置 Charles使用小技巧&#xff1a; 模拟慢速网络 Charles简介与安装 Charles的简介 Charles 是在 PC 端常用的网络封包截取工具…

Android 开发过程中常见的内存泄漏场景分析

场景1 Static变量存储上下文环境Context public class ClassName {// 定义1个静态变量private static Context mContext;//... // 引用的是Activity的contextmContext context; // 当Activity需销毁时&#xff0c;由于mContext 静态 & 生命周期 应用程序的生命周期&…

数字化转型导师坚鹏:科技金融政策、案例及营销创新

科技金融政策、案例及营销创新 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚科技金融有哪些利好的政策&#xff1f; 不知道科技金融有哪些成功的案例&#xff1f; 不知道科技金融如何进行营销创新&#xff1f; 课程特色&#xff1a; 以案例的方式解…

【重温设计模式】迭代器模式及其Java示例

迭代器模式的介绍 在编程领域&#xff0c;迭代器模式是一种常见的设计模式&#xff0c;它提供了一种方法&#xff0c;使得我们可以顺序访问一个集合对象中的各个元素&#xff0c;而又无需暴露该对象的内部表示。你可以把它想象成一本书&#xff0c;你不需要知道这本书是怎么印…

VLC播放器快捷键大全(史诗级最全)

文章目录 前言 a.倍速播放 b.快进快退 c.播放暂停 d.音量调节 e.跳到指定时间 f.画幅比例 缩放 裁剪 全屏 g.状态栏显示 h.截屏 录制 i.打开 保存 截屏 转化 四、总结 前…

vue+nodejs超市购物商城在线选品系统wtk87

在此基础上&#xff0c;结合现有超市货品信息管理体系的特点&#xff0c;运用新技术&#xff0c;构建了以 vue为基础的超市货品信息管理信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;根据需求分析结果进行了系统的设计&#xff0c;并将其划分为管理员和用户二种角…

章六、集合(1)—— Set 接口及实现类、集合迭代、Map 接口、Collections类

一、 Set 接口及实现类 Set接口不能存储重复元素 Set接口继承了Collection接口。Set中所存储的元素是不重复的,但是是无序的, Set中的元素是没有索引的 Set接口有两个实现类&#xff1a; ● HashSet &#xff1a;HashSet类中的元素不能重复 ● TreeSet &#xff1a;可以给Set集…

python(5)之处理数组

上次代码结果如下&#xff1a; 1、处理数组的缺失值 1、isnan&#xff08;&#xff09;函数 isnan&#xff08;&#xff09;函数是Numpy模块里的一个可以标记数组中缺失值的位置 代码示例如下&#xff1a; import numpy as np ac np.array([1,2,3,2,3,4,5,9,np.nan,1]) p…

系统分析与设计(一)

我们有这么多各式各样的工具,互联网给我们带来了这么多用户和数据,这是好事也有副作用。 世界上能访问用户数据,并根据数据做分析和改进的公司,大概Google是其中翘楚,这种 data-centric 的做法做过了头,也有悲剧发生: Douglas Bowman 曾经是Google 的视觉设计主管,2009年的一天…

设计模式:观察者模式 ⑧

一、思想 观察者模式是一种常见的设计模式&#xff0c;也称作发布-订阅模式。它主要解决了对象之间的通知依赖关系问题。在这种模式中&#xff0c;一个对象&#xff08;称作Subject&#xff09;维护着一个对象列表&#xff0c;这些对象&#xff08;称作Observers&#xff09;都…

Docker完整版(一)

Docker完整版&#xff08;一&#xff09; 一、Docker概述1.1、Docker简介1.2、Docker的用途1.3、容器与虚拟机的区别1.4、Docker系统架构1.5、Docker仓库 二、Docker引擎2.1、Docker引擎架构2.2、Docker引擎分类2.3、Docker引擎的安装2.4、Docker镜像加速器 三、Docker镜像3.1、…

新概念英语第二册(76)

【New words and expressions】生词和短语&#xff08;15&#xff09; fool n. 傻瓜 bulletin n. 新闻简报 announcer n. &#xff08;电视、电台&#xff09;播音员 macaroni n. …

线程-创建线程的方法、线程池

1.创建线程一共有哪几种方法&#xff1f; 继承Thread类创建线程 继承Thread类&#xff0c;重写run()方法&#xff0c;在main()函数中调用子类的strat()方法 实现Runnable接口创建线程 先创建实现Runnable接口的类&#xff0c;重写run()方法&#xff0c;创建类的实例对象&#…

kibana配置 dashbord,做可视化展示

一、环境介绍 这里我使用的kibana版本为7.17版本。 语言选择为中文。 需要已经有es&#xff0c;已经有kibana&#xff0c;并且都能正常访问。 二、背景介绍 kibana的可视化界面&#xff0c;可以配置很多监控统计界面。非常方便&#xff0c;做数据的可视化展示。 这篇文章&…

Java面试题(主要分清区别!!!)

RequestBody和ResponseBody的区别&#xff1f; RequestBody&#xff1a;接收json或xml数据 ResponseBody的&#xff1a;返回json或xml数据 RestController和Controller的区别&#xff1f; Controller&#xff1a;默认返回的是jsp页面 RestController&#xff1a;返回的是一个js…

自然语言处理(NLP)—— 生成式模型和判别式模型

生成式模型和判别式模型是机器学习领域两大类模型&#xff0c;它们在自然语言处理、计算机视觉等领域都有广泛的应用。理解这两类模型的区别对于选择正确的模型来解决特定问题非常重要。 1. 生成式模型 (Generative Models) 生成式模型旨在学习数据的联合概率分布\(P(X, Y)\)&…