依赖注入的三种方式

article/2025/9/14 22:32:18

DI(依赖注入)

注入的三种方法:构造器方法注入,set注入,基于注解的注入(接口注入)

1:构造器方法注入

创建一个Address类;


public class Address {private String address;public Address() {}public Address(String address) {this.address = address;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Address{" +"address='" + address + '\'' +'}';}
}

配置bean.xml

     <bean id="address" class="com.kuang.pojo.Address"><constructor-arg index="0" value="diqui"/></bean>

在bean标签内部使用 constructor-arg标签

type属性:使用类型指定构造方法中参数的类型

index属性:使用构造方法中参数索引值来 进行注入

name属性 :使用构造方法中参数名称 来注入 ( 常用!)

value属性:要注入的值(基本数据类型和String类型)

ref属性:要注入的值(引用在IOC容器中其他的bean对象)

优点:创建时必须要指定构造方法中的全部参数,bean才能被创建,保证了对象创建出来之后,成员变量一定都有值

缺点:必须要指定全部参数,否则无法创建,使用该方式改变了对象的创建过程

2: set注入

Set属性注入:必须要有一个无参的构造方法,否则只能用构造方法构造

1:创建一个User的类,给User一个Name属性;(这里是通过调用我们的set方法进行实现的)

2:配置xml文件

<!--IOC创建对象的方式,默认使用无参的构造方法!-->
<bean id="user" class="com.kuang.pojo.User"><property name="name" value="幺鸡"/>
</bean>

本质上包含两步:
第一步,需要new UserServiceImpl()创建对象, 所以需要默认构造函数
第二步,调用setUserDao()函数注入userDao的值, 所以需要setUserDao()函数

UserDaoImpl

public class UserDaoImpl implements UserDao {@Overridepublic void getUser() {System.out.println("默认获取用户的数据!");}
}

UserServiceImpl

public class UserServiceImpl implements UserService {private UserDao userDao;//利用set进行动态实现值的注入!public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getUser() {userDao.getUser();}
}

依赖注入:Set注入

  • 依赖:bean 对象的创建依赖于容器
  • 注入:bean 对象中的所有属性,有容器来注入!

1:谁依赖于谁:
当然是应用程序依赖于IoC容器;

2:为什么需要依赖:
应用程序需要IoC容器来提供对象需要的外部资源

3:谁注入谁:
很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

4:注入了什么:
就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

https://blog.csdn.net/qq_42709262/article/details/81951402

【环境搭建】

复杂类型
1:创建一个Student的类;


public class Student {private String name;private Address address;private String[] books;private List<String> hobbys;private Map<String,String> cards;private Set<String> games;//空指针private String wife;//Properties 配置类(配置文件等)private Properties info;public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String[] getBooks() {return books;}public void setBooks(String[] books) {this.books = books;}public List<String> getHobbys() {return hobbys;}public void setHobbys(List<String> hobbys) {this.hobbys = hobbys;}public Map<String, String> getCards() {return cards;}public void setCards(Map<String, String> cards) {this.cards = cards;}public Set<String> getGames() {return games;}public void setGames(Set<String> games) {this.games = games;}public String getWife() {return wife;}public void setWife(String wife) {this.wife = wife;}public Properties getInfo() {return info;}public void setInfo(Properties info) {this.info = info;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", address=" + address +", books=" + Arrays.toString(books) +", hobbys=" + hobbys +", cards=" + cards +", games=" + games +", wife='" + wife + '\'' +", info=" + info +'}';}
}

2:配置bean.xml

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="address" class="com.kuang.pojo.Address"><property name="address" value="地球"/></bean><bean id="student" class="com.kuang.pojo.Student"><!--第一种,普通值注入,value--><property name="name" value="hanshuo"/><!--第二种,Bean注入 --><property name="address" ref="address"/><!--数组注入--><property name="books"><array><value>西游记</value><value>红楼梦</value><value>水浒传</value><value>三国演义</value></array></property><!--List注入--><property name="hobbys"><list><value>听歌</value><value>敲代码</value><value>改Bug</value></list></property><!--Map--><property name="cards"><map><entry key="身份证" value="12345680"/><entry key="手机号" value="8676442268"/></map></property><!--Set--><property name="games"><set><value>LOL</value><value>COC</value><value>BOB</value></set></property><!--null--><property name="wife"><null/></property><!--Properties--><property name="info"><props><prop key="driver">20192301</prop><prop key="url">com.baidu.dirver</prop><prop key="username">root</prop><prop key="paeeword">root</prop></props></property></bean></beans>

3:测试

@Testpublic void address(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Address address = context.getBean("address", Address.class);System.out.println(address.getAddress());System.out.println(address.toString());}@Testpublic void student(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Student student = context.getBean("student", Student.class);System.out.println(student.toString());}

4:测试结果:

/*** * * * 地球* Address{address='地球'}* * * * Student{name='hanshuo',address=Address{address='山东'},books=[西游记, 红楼梦, 水浒传, 三国演义],hobbys=[听歌, 敲代码, 改Bug],cards={身份证=12345680, 手机号=8676442268},games=[LOL, COC, BOB],wife='null',info={url=com.baidu.dirver, driver=20192301, username=root, paeeword=root}}*/

p 命名和c 命名空间注入

1:创建一个User的类

public class User {private String name;private int age;public User(){}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

2;配置它的Bean

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--p 命名空间注入 可以直接输入属性的值: property--><bean id="user" class="com.kuang.pojo.User" p:name="绘画" p:age="12"/><!--c 命名空间注入 通过构造器进行注入: construct--><bean id="user2" class="com.kuang.pojo.User" c:name="幺鸡" c:age="20"/></beans>

可以直接输入属性的值: property
注意点:p命名空间和c命名空间不能直接使用,需要导入xml约束

xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"

在这里插入图片描述

测试:

    //p命名空间@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("userBeans.xml");User user = context.getBean("user", User.class);User user1 = context.getBean("user", User.class);System.out.println(user == user1);System.out.println(user);}

Bean的作用域

1:单例模式(Spring默认机制,)

<bean id="user" class="com.kuang.pojo.User" p:name="绘画" p:age="12" scope="singleton"/>

2:原型模式:每次从原型中get的时候,都会产生一个新的对象;

<bean id="user" class="com.kuang.pojo.User" p:name="绘画" p:age="12" scope="prototype"/>

3:其余的request , session, application

Spring 只帮我们管理单例模式 Bean 的完整生命周期,对于 prototype 的 bean ,Spring 在创建好交给使用者之后则不会再管理后续的生命周期。

Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁。

而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。每次客户端请求 prototype 作用域的 Bean 时,Spring 容器都会创建一个新的实例,并且不会管那些被配置成 prototype 作用域的 Bean 的生命周期。

了解 Spring 生命周期的意义就在于,可以利用 Bean 在其存活期间的指定时刻完成一些相关操作。这种时刻可能有很多,但一般情况下,会在 Bean 被初始化后和被销毁前执行一些相关操作。

关于Bean的生命周期
https://www.cnblogs.com/zrtqsk/p/3735273.html


http://chatgpt.dhexx.cn/article/0uL1l2Pj.shtml

相关文章

Pubmedy的使用教程

使用方法如下&#xff1a; 使用前先配置Sci-Hub的地址&#xff0c;如果网址不失效&#xff0c;配置一次即可 选中文章的DOI&#xff0c;右击选择Sci-Hub Search即可自动跳转到文章对应的Sci-Hub界面

Pubmedy加载时显示程序包无效的解决方案

目前谷歌应用商城已经下架Pubmedy&#xff0c;本地安装又遇到程序包无效&#xff1a;“CRX_HEADER_INVALID”。 解决方案&#xff1a; 将PubMedy.crx重命名为PubMedy.rar或者PubMedy.zip解压到要安装的位置找到扩展程序选项&#xff0c;并启用开发者选项选择加载已解压的扩展程…

细胞实验文献检索——PubMed | MedChemExpress

今天我们就以小白的课题——自噬 (Autophagy) 为例&#xff0c;给大家展示一波。这个时候给大家隆重介绍我们的——PubMed。 PubMed 提到 PubMed&#xff0c;相信大家应该都不陌生&#xff0c;它是常用的国外数据库之一&#xff0c;也是小编查找文献最喜欢的工具。自成立以来…

免费获取论文全文的方法,SCI-HUB的使用教程

很多人不在学校期间需要看文献全文&#xff0c;很多人获取文章的方式或是在网上求助或是给原作者索要。在SCI—HUB出现后&#xff0c;这些麻烦都不需要。SCI—PUB上保存了超过了4700万篇科研文献。SCI—PUB的网址 使用方法&#xff1a; 方法一、打开网页将想要论文的URL地址&…

SCI-HUB丨最新文献网址

sci-hub&#xff1a;在我们获取文献与学术论文的道路上提供了极好的便利&#xff0c;可以从中得到免费的文献下载&#xff0c;但也因为这样遭到各大出版社&#xff1a;ai思为尔&#xff0c;施普林格&#xff0c;wiley等出版社的打击与封杀&#xff0c;使得Sci-Hub在域名上不得不…

pubmed显示服务器不稳定,PubMed天天用,可是你真的用对了吗?

你是用关键词在PubMed上找论文的吗&#xff1f;如果关键词好几个&#xff0c;由于单词间的空格键存在AND命令&#xff0c;导致明明要搜的是词组&#xff0c;搜索不是被放大就是缩小&#xff0c;很难检索到合适量且关联度高的文。例如&#xff0c;你想找和肠炎与肿瘤坏死因子相关…

pubmed文献批量化下载器

1.代码如下 import time import requests import pandas as pd import osdef getArticle(PMCID,NIHMSID,DOI,title,path):print(PMCID,NIHMSID,DOI,title,path)os.chdir(path)headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…

PubMed插件:分区、影响因子和即时IF一目了然,还能秒下文献(亲测有效)

Pubmed作为生物医药研究者最常用的免费文摘数据库&#xff0c;素有检索江湖上的泰山北斗之称&#xff0c;用好Pubmed&#xff0c;其他一切pubmed镜像网站都是浮云。今天小编给大家介绍一款完全免费的无需登录的pubmed插件&#xff0c;他可以解决pubmed本身不显示杂志影响因子的…

干货分享|被PubMed收录的论文,在MEDLINE和SCIE能检索到吗?

PubMed PubMed是由美国国家医学图书馆&#xff08;National Library of Medicine&#xff0c;NLM&#xff09;的国家生物技术信息中心&#xff08;National Center for Biotechnology Information&#xff0c;NCBI&#xff09;开发研制的一个医学文献网络数据库。PubMed是当今…

MEDLINE与PubMed有什么区别?检索范围包含哪些?

PubMed PubMed是由美国国家医学图书馆&#xff08;National Library of Medicine&#xff0c;NLM&#xff09;的国家生物技术信息中心&#xff08;National Center for Biotechnology Information&#xff0c;NCBI&#xff09;开发研制的一个医学文献网络数据库。 PubMed是当今…

怎么找生物信息论文的数据,PubMed太有用了!

小白的创作灵感日志&#xff1a; 由于要跑通一篇Paper A的代码&#xff0c;我需要找到它用到的所有数据集&#xff0c;今天我要找的是 Nagano 细胞周期数据集&#xff0c;刚开始脑子一团浆糊&#xff0c;直接在谷歌上搜“Nagano”&#xff0c;出来的全都是日本的一个名叫Nagano…

PubMed文献影响因子怎么显示保姆教程

NCBI文献影响因子显示&#xff1a; 安装的第一个插件&#xff1a;Tampermonkey插件网址&#xff1a;Greasy Fork - 安全、实用的用户脚本大全 1.选择合适的浏览器进行安装 2.点击安装 安装的第二个插件&#xff1a;scholarscope 1.网址&#xff1a;Scholarscope | 更好的科研…

文献管理器PubMedPro使用

PubMedPro介绍 Pubmed.pro文献检索文献管理网站&#xff1a; 您可以将自己电脑中的文献PDF批量上传至本网站&#xff0c;所有文件会自动同步至云端&#xff0c;您可以子啊任意一台电脑、平板、手机&#xff0c;通过自己的账号在线访问文献PDF。也可以分享自己的文献给身边的同…

科研小助手PubMed的插件PubMedy

Scholarscope首页地址&#xff1a; https://www.scholarscope.cn/(此链接就可以帮你安装&#xff0c;里面“查看安装教程”下面有个“立即前往安装教程页面”按钮&#xff0c;点击即可。) 此插件的安装也很简单&#xff0c;在Chrome浏览器的安装跟其他插件的安装没有区别。 而…

PubMed插件神器之PubMedy和Scholarscope(末尾附赠Google截屏神器)

生信读研第一件事绝对是读大量文献&#xff0c;那么如何在PubMed大量的文献中筛选出自己想要并且高质量的呢&#xff1f;当然第一反应肯定是检索式&#xff0c;但这得自己清楚的知道课题的关键词才能准确筛选。 刚进实验室&#xff0c;大师兄就扔给我两篇文献让我去了解。但是!…

jdk完全卸载方法

Win7系统下安装jdk报错&#xff1b;错误信息&#xff1a;“ Windows Installer 程序包有问题。此安装需要的DLL不能运行。请与您的支持人员或程序包开发商联系”。 造成该问题的原因是系统以前安装过jdk&#xff0c;重新安装需要彻底卸载旧的jdk&#xff0c;这样重新安装才能成…

JDK卸载与安装

JDK卸载 **第一步:**通过环境变量找到 JDK安装路径。 **第二步&#xff1a;**删除JDK安装包。 **第三步&#xff1a;**删除JAVA_HOME及path下关于java的目录 **第四步&#xff1a;**打开cmd 命令输入java -version检验是否删除成功。 安装JDK 1、百度搜索JDK8&#xff…

卸载和安装JDK

JDK全称Java Developent Kit&#xff0c;Java跨平台是使用了虚拟机&#xff08;&#xff4a;&#xff56;&#xff4d;&#xff09;在任何地方都可以运行。JDK包含了JRE和JVM。 卸载JDK 1、删除java的安装目录&#xff1a; 右击我的电脑-属性&#xff0c;做已下的操作&…

MacOS安装与卸载JDK

文章目录 1. 下载JDK8安装文件2. 安装JDK文件2.1 双击pkg文件安装即可2.2 查看JDK安装位置2.3 确定jdk安装完整 3. 配置JDK环境变量3.1 打开终端窗口&#xff0c;打开基础配置文件3.2 配置java环境变量3.3 激活配置3.4 输入javac和javap看是否安装成功 4. 卸载JDK(任何版本都行…

Linux上快速安装、卸载JDK

Linux上快速安装、卸载JDK Linux上安装JDK步骤1. 安装JDK2. 如何卸载JDK Linux上安装JDK步骤 1. 安装JDK 准备工作&#xff1a;确保机器在安装之前&#xff0c;系统没有默认安装JDK&#xff0c;可通过以下命令进行检查 java -version注意&#xff1a;如果是自己在虚拟机上安…