spring学习(spring-DI(setter注入、构造器注入、自动装配方式))

目录

一、spring容器(DI)依赖注入的几种实现方式。

(1)手动注入。

(2)自动注入。

(3)图解如下。

二、spring容器实现(DI)依赖注入-setter注入方式。

(1)setter注入方式的基本介绍。

(2)setter注入方式的具体实现步骤。

0、demo(案例)准备工作(需知)。

1、定义需交给spring容器管理的bean类。

2、spring配置文件中配置bean。(XML)

重点标签<property name="?" ref="?">。

3、使用spring容器来获取Bean的实例。

三、spring容器实现(DI)依赖注入-构造器注入方式。

(1)构造器注入方式的基本介绍。

(2)构造器注入方式的具体实现步骤。

0、demo(案例)准备工作(需知)。

1、定义需交给spring容器管理的bean类。

2、spring配置文件中配置bean。(XML)

重点标签<constructor-arg ref="">。

3、使用spring容器来获取Bean的实例。

四、spring容器实现(DI)依赖注入-自动装配方式。

(1)自动装配方式的基本介绍。

(2)自动装配方式的具体实现步骤。

0、demo(案例)准备工作(需知)。

1、spring配置文件中配置bean与开启自动装配。(XML)

<1>属性autowire="byName"。

<2>属性autowire="byType"。


  • 本篇博客围绕spring容器对(bean实例化)与(bean与bean之间依赖关系)的管理。

一、spring容器(DI)依赖注入的几种实现方式。

(1)手动注入。
  • 通过手动提供“需要依赖注入的属性与setter方法”完成注入操作。
  • 通过手动提供“有参构造方法且方法参数为需要依赖注入属性”完成注入操作。

(2)自动注入。
  • 内部运行时,还是依靠提供setter方法实现。
  • 需要使用属性"autowire"来实现。

(3)图解如下。
  • 具体是spring容器实现DI(依赖注入)的几种方式如下展示。

二、spring容器实现(DI)依赖注入-setter注入方式。

(1)setter注入方式的基本介绍。
  • 在spring框架中,DI(依赖注入)是一种实现IoC(控制反转)的重要机制
  • 它允许对象在创建时不必关心依赖对象的创建和获取,而是将这些依赖关系由外部容器(spring容器)来管理。spring提供了多种依赖注入的方式,其中setter注入是一种常见的方法。下面就来演示具体的实现步骤。

(2)setter注入方式的具体实现步骤。
0、demo(案例)准备工作(需知)。
  • 提供实体类"A"与"B"。分别位于demo包下。
  • 测试类MainApp。其中代码内容是关于使用spring容器加载配置文件并获取对应Bean。内部使用setter方法实现依赖注入,获取成员变量的实例化bean。
  • spring配置文件名:springBean.xml。

1、定义需交给spring容器管理的bean类。
  • 类"A"代码。在A类中创建成员变量(类"B")。提供setter方法,通过依赖注入(DI)方式获取该属性的实例化bean。
  • 提供成员方法save(),自身打印输出外,调用成员变量b(B类对象)的save()方法。
package com.fs.demo;public class A {//成员变量:B类属性(对象)B b;//提供setter方法public void setB(B b){this.b = b;}//A类save()方法public void save(){System.out.println("A save...");//通过依赖注入的方式获取B类的实例化bean//调用B类的save()方法b.save();}
}
  • 类"B"代码。类中提供成员方法save()。
package com.fs.demo;public class B {//B类save()方法public void save(){System.out.println("B save...");}
}
2、spring配置文件中配置bean。(XML)
  • 重点标签<property name="?" ref="?">。
  • name属性值一定要与使用依赖注入的类(A类)的成员变量名相同
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置A类bean--><bean id="a" class="com.fs.demo.A"><!--name:对应A类中属性名 ref:依赖的类B(id)--><property name="b" ref="b"></property></bean><!--配置B类bean--><bean id="b" class="com.fs.demo.B"></bean></beans>

3、使用spring容器来获取Bean的实例。
  • 该操作主要在测试类(MainApp)中实现!
  • 通过spring容器ApplicationContext加载spring配置文件。再通过容器对象的getBean()方法获得相应的bean。最后调用方法完成操作。
package com.fs.test;import com.fs.demo.A;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp {public static void main(String[] args) {//使用IoC容器(ApplicationContext)获取spring容器管理的bean对象//1.创建容器对象。实例化时参数指定对应的配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springBean.xml");//2.通过<bean>标签的唯一标识id获取对应在spring容器已经配置的bean对象(生产A类的bean)Object obj = context.getBean("a");//3.强制类型转换A a = (A) obj;a.save();}
}
  • 程序运行结果与简单解释。

三、spring容器实现(DI)依赖注入-构造器注入方式。

(1)构造器注入方式的基本介绍。
  • 在spring框架中,构造器注入是一种依赖注入的方式。构造器注入方式通过构造器(有参构造方法)将依赖传递给Bean
  • 这种方式可以确保Bean在使用之前完全初始化,并且可以提供更好的编译时检查。
  • 下面就来演示具体的实现步骤。

(2)构造器注入方式的具体实现步骤。
0、demo(案例)准备工作(需知)。
  • 提供实体类"C"与"D"。分别位于demo2包下。
  • 测试类MainApp02。其中代码内容是关于使用spring容器加载配置文件并获取对应Bean。内部使用构造器实现依赖注入,获取成员变量的实例化bean。
  • spring配置文件名:springBean.xml。


1、定义需交给spring容器管理的bean类。
  • 类"C"代码。在C类中创建成员变量(类"D")。
  • 不需要提供setter方法。只需提供对应的有参构造方法,且参数的类型为成员变量(类"D")。通过构造器实现依赖注入(DI)方式再获取该成员属性的实例化bean。
  • 提供成员方法save(),自身打印输出外,调用成员变量d(D类对象)的save()方法。
package com.fs.demo2;
//类C
public class C {//只从代码上看,d好像空对象(null)//但最终因交给spring容器管理,通过DI完成bean的实例化D d;//构造器方式实现依赖注入(D类的成员变量d)public C(D d){this.d = d;}//类C的save()方法public void save(){System.out.println("C save...");//通过依赖注入的方式获取D类的实例化bean//调用D类的save()方法d.save();}
}
  • 类"D"代码。类中提供成员方法save()。
package com.fs.demo2;public class D {//类D的save()方法public void save(){System.out.println("D save...");}
}
2、spring配置文件中配置bean。(XML)
  • 重点标签<constructor-arg ref="?">。
  • 把之前spring配置文件里面的<property>标签换成<constructor-arg>标签即可。其中属性"ref"的值为依赖注入的类对应标签<bean>所绑定的id即可。

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置C类bean--><bean id="c" class="com.fs.demo2.C"><!--使用构造器(有参构造)给成员变量D类对象d实现依赖注入(实例化bean)--><constructor-arg ref="d"></constructor-arg></bean><!--配置D类bean--><bean id="d" class="com.fs.demo2.D"></bean></beans>
3、使用spring容器来获取Bean的实例。
  • 该操作主要在测试类(MainApp2)中实现!
  • 通过spring容器ApplicationContext加载spring配置文件。再通过容器对象的getBean()方法获得相应的bean。最后调用方法完成操作。
package com.fs.test;import com.fs.demo2.C;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp02 {public static void main(String[] args) {//使用IoC容器(ApplicationContext)获取spring容器管理的bean对象//1.创建容器对象。实例化时参数指定对应的配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springBean.xml");//2.通过<bean>标签的唯一标识id获取对应在spring容器已经配置的bean对象(生产UserServiceImpl类的bean)Object obj = context.getBean("c");//3.强制类型转换C c = (C) obj;c.save();}
}
  • 程序运行结果与简单解释。

四、spring容器实现(DI)依赖注入-自动装配方式。

  • 此模块的代码明天再完善。

(1)自动装配方式的基本介绍。
  • 在spring框架中,自动装配(Autowiring)是一种自动解决Bean依赖关系的方式。
  • 其实自动装配方式实现依赖注入的操作底层还是依赖setter方法。不显式的指定依赖关系其实就是将之前繁琐的<property>这步简化,通过属性"autowire"指定值(byName/byType)。值"byName"或"byType"具体的用法下面会介绍。


  • spring容器可以在创建Bean时自动注入其他Bean的引用,而不需要显式地指定依赖关系。下面就来演示具体的实现步骤。

(2)自动装配方式的具体实现步骤。
0、demo(案例)准备工作(需知)。
  • 提供实体类"C"与"D"。分别位于demo2包下。
  • 测试类MainApp02。其中代码内容是关于使用spring容器加载配置文件并获取对应Bean。内部使用自动装配(底层依赖setter方法)实现依赖注入,获取成员变量的实例化bean。项目的测试不同情况:根据属性autowire值得不同进行不同的测试。

1、spring配置文件中配置bean与开启自动装配。(XML)
  • 注意:可能通过文字的描述让人不太好理解

<1>属性autowire="byName"。
  • byName:就是寻找配置文件中所有<bean>内的属性id(先首字母转换成大写)是否与提供的setter方法后缀一致!如age——>setAge()、name——>setName()。否则无法通过setter方法自动装配完成依赖注入!
  • 总之当autowire="byName"时<bean>的id与setter方法名息息相关的。下面博主测试了一部分情况。

  • 如果<bean id="Age" .....> 对应提供的setter方法为:setAge()也是无法自动装配识别的。(也就是使用byName对应<bean>的id的首字母必须小写
package com.fs.demo2;
//类C
public class C {D d;//自动装配底层还是依赖setter方法public void setD(D d) {this.d = d;}//类C的save()方法public void save(){System.out.println("C save...");//通过依赖注入的方式获取D类的实例化bean//调用D类的save()方法d.save();}
}

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置C类bean通过autowire属性指定依赖。不需要显式地使用ref指定依赖关系--><bean id="c" class="com.fs.demo2.C" autowire="byName"></bean><!--配置D类bean--><bean id="d" class="com.fs.demo2.D"></bean></beans>
  • 测试结果:成功。(正常写法:首字母小写)


  • 如果"id"字符串的首字母大写。报错!无法实现依赖注入
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置C类bean通过autowire属性指定依赖。不需要显式地使用ref指定依赖关系--><bean id="c" class="com.fs.demo2.C" autowire="byName"></bean><!--配置D类bean--><bean id="D" class="com.fs.demo2.D"></bean></beans>
  • 测试结果:失败。


  • "id"字符串中间有多个字符串可以大写或小写,只是对应setter方法名需要变更
  • 此时被依赖注入的bean绑定的id为"daaAge"。(首字母为小写,中间大小写,结尾为小写)
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置C类bean通过autowire属性指定依赖。不需要显式地使用ref指定依赖关系--><bean id="c" class="com.fs.demo2.C" autowire="byName"></bean><!--配置D类bean--><bean id="daaAge" class="com.fs.demo2.D"></bean><!--配置D类bean--><!--<bean id="assAsE" class="com.fs.demo2.D"></bean>--><!--<bean id="c" class="com.fs.demo2.C" autowire="byName"></bean>--></beans>
  • 只需要按要求将对应的setter方法名修改也是可以完成依赖注入的。


  • "id"字符串末尾可以小写或大写,只是对应setter方法名需要变更。


<2>属性autowire="byType"。
  • 这里就不需要关注setter方法的后缀名或者id的取值
  • 只需实现依赖注入的<bean>添加属性autowire="byType",然后可以在其他<bean>的属性"class"找到被依赖注入的类即可。

  • 如"C"类需要使用依赖注入将"D"类的对象注入进来。那么在spring配置文件中"C"类对应的<bean>的属性autowire="byType"。"D"类对应的bean的"class"属性需要与"D"类的对象的类的引用一致。注意要求注入的Type只能是一个,如果有多个则发生报错。具体看下面。

  • 正常写法。
package com.fs.demo2;
//类C
public class C {D d;//自动装配底层还是依赖setter方法public void setD(D d) {this.d = d;}//类C的save()方法public void save(){System.out.println("C save...");//通过依赖注入的方式获取D类的实例化bean//调用D类的save()方法d.save();}
}
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置C类bean通过autowire属性指定依赖。不需要显式地使用ref指定依赖关系--><bean id="c" class="com.fs.demo2.C" autowire="byType"></bean><!--配置D类bean--><bean id="d" class="com.fs.demo2.D"></bean><!--配置D类bean--><!--<bean id="assAsE" class="com.fs.demo2.D"></bean>--></beans>


  • 提供对应Type的<bean>的class有多个时!会报错,因为程序不知道你要使用哪个!


  • 提供对应Type的<bean>的class有多个时出现的异常信息。


  • 就算再有一个类"A"去实现依赖注入类"D"对象。使用autowire="byType"也是不能让对应Type的<bean>的class为多个。无法识别到底使用哪个

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

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

相关文章

AI的进阶之路:从机器学习到深度学习的演变(三)

&#xff08;承接上集&#xff1a;AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;二&#xff09;&#xff09; 四、深度学习&#xff08;DL&#xff09;&#xff1a;机器学习的革命性突破 深度学习&#xff08;DL&#xff09;作为机器学习的一个重要分支&am…

什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap

在刚刚过去的 FlutterInProduction 活动里&#xff0c;Flutter 官方除了介绍「历史进程」和「用户案例」之外&#xff0c;也着重提及了未来相关的 roadmap &#xff0c;其中就有 3.27 里的 Swift Package Manager 、 Widget 实时预览 和 Dart 与 native 平台原生语言直接互操作…

mysql的事务控制和数据库的备份和恢复

事务控制语句 行锁和死锁 行锁 两个客户端同时对同一索引行进行操作 客户端1正常运行 客户端2想修改&#xff0c;被锁行 除非将事务提交才能继续运行 死锁 客户端1删除第5行 客户端2设置第1行为排他锁 客户端1删除行1被锁 客户端2更新行5被锁 如何避免死锁 mysql的备份和还…

基于 uniapp 开发 android 播放 webrtc 流

一、播放rtsp协议流 如果 webrtc 流以 rtsp 协议返回&#xff0c;流地址如&#xff1a;rtsp://127.0.0.1:5115/session.mpg&#xff0c;uniapp的 <video> 编译到android上直接就能播放&#xff0c;但通常会有2-3秒的延迟。 二、播放webrtc协议流 如果 webrtc 流以 webrt…

(OCPP服务器)SteVe编译搭建全过程

注意&#xff1a;建议使用3.6.0&#xff0c;我升级到3.7.1&#xff0c;并没有多什么新功能&#xff0c;反而电表的实时数据只能看到累计电能了&#xff0c;我回退了就正常&#xff0c;数据库是兼容的&#xff0c;java版本换位java11&#xff0c;其他不变就好 背景&#xff1a;…

C++ OpenGL学习笔记(2、绘制橙色三角形绘制、绿色随时间变化的三角形绘制)

相关文章链接 C OpenGL学习笔记&#xff08;1、Hello World空窗口程序&#xff09; 目录 绘制橙色三角形绘制1、主要修改内容有&#xff1a;1.1、在主程序的基础上增加如下3个函数1.2、另外在主程序外面新增3个全局变量1.3、编写两个shader程序文件 2、initModel()函数3、initS…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路&#xff1a; 一、项目背景 二、功能分析 查询功能流程图&#xff1a; 管理功能流程图&#xff1a; 三、设计 四、实现 代码实现&#xff1a; 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树&#xff08;打印&#xff09; 建立右兄弟…

Leaflet的zoom层级-天地图层级之间的关系

Leaflet的tileLayer请求地址分析 天地图的瓦片服务地址&#xff1a; http://t1.tianditu.com/img_c/wmts?layerimg&styledefault&tilematrixsetc&ServiceWMTS&RequestGetTile&Version1.0.0&Formattiles&TileMatrix{z}&TileCol{x}&TileRo…

常用的JVM启动参数有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【常用的JVM启动参数有哪些?】面试题。希望对大家有帮助&#xff1b; 常用的JVM启动参数有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM启动参数用于配置Java虚拟机&#xff08;JVM&#xff09;的运行时行为…

CTF学习24.12.21[隐写术进阶]

MISC08[隐写术进阶] PDF文件隐写 隐写的加密&#xff1a;wbStego4open工具的下载和使用 1.wbStego4open介绍&#xff1a; wbStego4open是一个隐写开源工具&#xff0c;它支持Windows和Linux平台&#xff0c;可以使用wbStego4open把文件隐藏到BMP、TXT、HTM和PDF文件中&#…

电脑丢失dll文件一键修复的多种方法分析,电脑故障修复攻略

电脑在使用过程中&#xff0c;有时会遇到DLL文件丢失的情况&#xff0c;这可能导致软件无法正常运行或系统出现故障。当面对这种状况时&#xff0c;不必过于慌张&#xff0c;因为有多种有效的修复方法可供选择。下面我们一起来看看电脑丢失dll文件的多种解决方法。 一.了解什么…

Redis篇--常见问题篇5--热Key(Hot Key,什么是热Key,服务降级,一致性哈希)

热key&#xff08;Hot Key&#xff09;是指在Redis中访问频率非常高、读写请求非常频繁的键。由于Redis是单线程模型&#xff0c;所有操作都是串行执行的&#xff0c;Hot Key处理不好&#xff0c;会产生一些问题。比如短时间的群蜂效应&#xff08;群蜂请求&#xff09;&#x…

VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用

VSCode&#xff1a;Markdown插件安装使用 1.安装Marktext2.使用Marktext 本文&#xff0c;将在Visual Studio Code中&#xff0c;安装和使用Markdown插件&#xff0c;以Marktext插件为例。 1.安装Marktext 打开VSCode&#xff0c;侧边栏中找到扩展模块(或CtrlShiftX快捷键)&am…

SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频

要使用阿里云视频点播&#xff08;VOD&#xff09;实现一个教育网站&#xff0c;其中用户需要成为会员后才能查看视频&#xff0c;这个过程包括上传视频、设置权限控制、构建前端播放页面以及确保只有付费会员可以访问视频内容。 1. 视频上传与管理 创建阿里云账号&#xff…

深度学习——现代卷积神经网络(七)

深度卷积神经网络 学习表征 观察图像特征的提取⽅法。在合理地复杂性前提下&#xff0c;特征应该由多个共同学习的神经⽹络层组成&#xff0c;每个层都有可学习的参数。 当年缺少数据和硬件支持 AlexNet AlexNet⽐相对较⼩的LeNet5要深得多。 AlexNet由⼋层组成&#xff1a…

免费送源码:Java+ssm++MVC+HTML+CSS+MySQL springboot 社区医院信息管理系统的设计与实现 计算机毕业设计原创定制

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设社区医院信息管理系统…

Marin说PCB之POC电路layout设计仿真案例---06

我们书接上回啊&#xff0c;对于上面的出现原因我这个美女同事安娜说会不会你把POC电感下面的相邻两层的CUT_OUT的尺寸再去加大一些会不会变得更好呢&#xff1f;这个难道说是真的有用吗&#xff1f;小编我先自己算一卦看下结果。 本期文章我们就接着验证通过改善我们的单板POC…

简洁清爽epub 阅读器

Jane Reader 是一款现代化的 epub 阅读器&#xff0c;有简洁清爽&#xff0c;支持自动多栏、多主题、直排模式等&#xff0c;开发者想要提供「媲美于印刷书籍的阅读体验」 Jane Reader 目前提供以下功能&#xff1a; 支持 epub 电子书格式&#xff1b; 内置书库&#xff1b; 支…

TDesign:NavBar 导航栏

NavBar 导航栏 左图&#xff0c;右标 appBar: TDNavBar(padding: EdgeInsets.only(left: 0,right: 30.w), // 重写左右内边距centerTitle:false, // 不显示标题height: 45, // 高度titleWidget: TDImage( // 左图assetUrl: assets/img/logo.png,width: 147.w,height: 41.w,),ba…

javaFX.(蜜雪冰城点餐小程序)MySQL数据库

学习Java只有3个月&#xff0c;不喜勿喷 该小程序是用的MySQL数据库&#xff0c;编辑软件用的equals,为什么不用idea有提示因为主打一个纯手打 要源码私信 目录 javafx.小程序&#xff08;蜜雪冰城点餐系统&#xff09;简介 主体思路 思路讲解 用户登录 用户注册 忘记…