spring模块(一)DI依赖注入

一、介绍:Dependency Injection,组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

二、三种依赖注入的方式

(1)setter方法注入:使用属性的setter方法注入 ,这是最常用的方式。Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。前提是Bean提供一个默认的构造函数;

(2)构造方法注入:是除属性注入之外的另一种常用的注入方式,它保证一些必要的属性在Bean实例化时就得到设置,并且确保了Bean实例在实例化后就可以使用。构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。 前提是Bean必须提供带参的构造函数;

(3)接口注入:由于在灵活性和易用性比较差,从Spring4开始已被废弃。

构造函数注入setter 注入
没有部分注入有部分注入
不会覆盖 setter 属性会覆盖 setter 属性
任意修改都会创建一个新实例任意修改不会创建一个新实例
适用于设置很多属性适用于设置少量属性

具体来看下:

1、setter属性注入:

(1)语法:

<bean id=”……” class=”……”>  <property name=”属性1” value=”……”/>  <property name=”属性2” value=”……”/>  ……  
</bean>  

(2)demo: 

1、bean
package com.demo.model;
public class Car {private int maxSpeed;private String brand;private double price;public int getMaxSpeed() {return maxSpeed;}//一定要写被注入对象的set方法public void setMaxSpeed(int maxSpeed) {this.maxSpeed = maxSpeed;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public void run(){System.out.println("brand:"+brand+",maxSpeed:"+maxSpeed+",price:"+price);}
}2、
<!-- 属性注入 -->
<bean id="car" class="com.demo.model.Car">  <property name="maxSpeed" value="200"></property><property name="brand" value="红旗CA72"></property>  <property name="price" value="200000.00"></property>
</bean>3、测试:
public void test(){//读取配置文件ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");//获取bean的实例Car car=(Car) ctx.getBean("car");car.run();
}

2、构造函数注入:

(1)语法:

    ① 在类中,不用为属性设置setter方法,但是需要生成该类带参的构造方法;

    ② 在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到了<constructor-arg>节点,该节点有四个属性: · index是索引,指定注入的属性,从0开始; · type是指该属性所对应的类型; · ref 是指引用的依赖对象; · value 当注入的不是依赖对象,而是基本数据类型时,就用value; 

(2)方式:有三种:

   ① 按类型匹配入参:在<constructor-arg>的元素中有一个type属性,它表示构造函数中参数的类型,为spring提供了判断配置项和构造函数入参对应关系的“信息”。

package com.demo.model;public class Car {private int maxSpeed;private String brand;private double price;//带参构造方法public Car(int maxSpeed,String brand, double price){this.maxSpeed=maxSpeed;this.brand=brand;this.price=price;}public void run(){System.out.println("brand:"+brand+",maxSpeed:"+maxSpeed+",price:"+price);}
}<!-- 构造函数注入(按类型匹配) -->
<bean id="car1" class="com.demo.model.Car">  <constructor-arg type="int" value="300"></constructor-arg><constructor-arg type="java.lang.String" value="宝马"></constructor-arg><constructor-arg type="double" value="300000.00"></constructor-arg>
</bean>

② 按索引匹配入参:

public Car(String brand, String corp,double price){this.brand=brand;this.corp=corp;this.price=price;
}<!-- 构造函数注入(按索引匹配) -->
<bean id="car2" class="com.demo.model.Car"> <!-- 注意索引从0开始 --> <constructor-arg index="0" value="宝马"></constructor-arg><constructor-arg index="1" value="中国一汽"></constructor-arg><constructor-arg index="2" value="300000.00"></constructor-arg>
</bean>

 ③ 联合使用类型和索引匹配入参:

public Car(String brand, String corp,double price){this.brand=brand;this.corp=corp;this.price=price;
}public Car(String brand, String corp,int maxSpeed){this.brand=brand;this.corp=corp;this.maxSpeed=maxSpeed;
}<!-- 构造函数注入(通过入参类型和位置索引确定对应关系) -->
<!-- 对应public Car(String brand, String corp,int maxSpeed)构造函数 -->
<bean id="car3" class="com.demo.model.Car">  <constructor-arg index="0" type="java.lang.String" value="奔驰"></constructor-arg><constructor-arg index="1" type="java.lang.String" value="中国一汽"></constructor-arg><constructor-arg index="2" type="int" value="200"></constructor-arg>
</bean>

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

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

相关文章

【策】策略

为应对未来激烈的竞争&#xff0c;需要具备以下要素&#xff1a; 主动选择。每个人都有主动选择的权利&#xff0c;既然做出选择&#xff0c;应对其产生的结果而负责。反逆向思维。梳理过程&#xff0c;分析因果&#xff0c;优化决策。

How to implement anti-crawler strategies to protect site data

How to implement anti-crawler strategies to protect site data 信息校验型反爬虫User-Agent反爬虫Cookie反爬虫签名验证反爬虫WebSocket握手验证反爬虫WebSocket消息校验反爬虫WebSocket Ping反爬虫 动态渲染反爬虫文本混淆反爬虫图片伪装反爬虫CSS偏移反爬虫SVG映射反爬虫字…

VM与欧姆龙PLC通讯设置

1、欧姆龙PLC 进行网口通讯&#xff0c;协议用的Fins tcp&#xff0c;也可以用Fins UDP。 2、主要步骤如下&#xff1b; step1&#xff1a;设置IP地址、端口号默认是9600&#xff0c;根据需要设置寄存器首地址和寄存器数量 step2&#xff1a;鼠标移动到某个地址下&#xff0c…

Python入门-函数

1.函数的定义及调用 函数&#xff1a;函数是将一段实现功能的完整代码&#xff0c;使用函数名称进行封装&#xff0c;通过函数名称进行调用。 以此达到一次编写&#xff0c;多次调用的目的 def get_sum(num): #num叫形式参数s0for i in range(1,num1):siprint(f1到{num}之…

数字后端设计实现 | 数字后端PR工具Innovus中如何创建不同高度的row?

吾爱IC社区星球学员问题&#xff1a;Innovus后端实现时两种种不同高度的site能做在一个pr里面吗&#xff1f; 答案是可以的。 Innovus支持在同一个设计中中使用不同的row&#xff0c;但需要给各自子模块创建power domain。这里所说的不同高度的row&#xff0c;有两种情况。 1…

Docker一键极速安装Nacos,并配置数据库!

1 部署方式 1.1 DockerHub javaedgeJavaEdgedeMac-mini ~ % docker run --name nacos \ -e MODEstandalone \ -e JVM_XMS128m \ -e JVM_XMX128m \ -e JVM_XMN64m \ -e JVM_MS64m \ -e JVM_MMS64m \ -p 8848:8848 \ -d nacos/nacos-server:v2.2.3 a624c64a1a25ad2d15908a67316d…

指针大礼包6

第6题 &#xff08;10.0分&#xff09; 题号:5 难度:中 第8章 /*------------------------------------------------------- 【程序改错】 --------------------------------------------------------- 题目&#xff1a;下列给定程序中函数fun的功能是…

代码随想录刷题第三十九天| 62.不同路径 ● 63. 不同路径 II

代码随想录刷题第三十九天 不同路径 (LC 62) 题目思路&#xff1a; 代码实现&#xff1a; class Solution:def uniquePaths(self, m: int, n: int) -> int:dp [[0 for _ in range(n1)] for _ in range(m1)]dp[0][1] 1for i in range(1,m1):for j in range(1, n1):dp[i]…

使用IDEA官方docker插件构建镜像

此方法同样适用于jetbrains系列的其他开发软件 在IDEA中&#xff0c;如果是maven项目&#xff0c;可以使用插件 <plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version> &…

Linux入门攻坚——11、Linux网络属性配置相关知识1

网络基础知识&#xff1a; 局域网&#xff1a;以太网&#xff0c;令牌环网&#xff0c; Ethernet&#xff1a;CSMA/CD 冲突域 广播域 MAC&#xff1a;Media Access Control&#xff0c;共48bit&#xff0c;前24bit需要机构分配&#xff0c;后24bit自己…

WPF 如何知道当前有多少个 DispatcherTimer 在运行

在 WPF 调试中&#xff0c;对于 DispatcherTimer 定时器的执行&#xff0c;没有直观的调试方法。本文来告诉大家如何在 WPF 中调试当前主线程有多少个 DispatcherTimer 在运行 在 WPF 中&#xff0c;如果有 DispatcherTimer 定时器在执行&#xff0c;将会影响到主线程的执行&a…

Qt6入门教程 2:Qt6下载与安装

Qt6不提供离线安装包&#xff0c;下载和安装实际上是一体的了。 关于Qt简介&#xff0c;详见&#xff1a;Qt6入门教程1&#xff1a;Qt简介 一.下载在线安装器 Qt官网 地址&#xff1a;https://download.qt.io/ 在线下载器地址&#xff1a;https://download.qt.io/archive/on…

Unity | NGO网络框架

目录 一、相关属性及变量 1.ServerRpc属性 2.ClientRpc属性 3.NetworkVariable变量 二、相关组件 1.NetworkManager 2.Unity Transport 3.Network Object 4.NetworkBehaviour&#xff1a; 5.NetworkTransform Syncing(Synchronizing) Thresholds Interpolation 三…

Linux下Redis6下载、安装和配置教程-2024年1月5日

Linux下Redis6下载、安装和配置教程-2024年1月5日 一、下载二、安装三、启动四、设置开机自启五、Redis的客户端1.Redis命令行客户端2.windows上的图形化桌面客户端 一、下载 1.Redis的官方下载&#xff1a;https://redis.io/download/ 2.网盘下载&#xff1a; 链接&#xff…

Docker overlay2文件busy,容器不能删除问题解决

文章目录 在删除docker容器的时候报错,说设备正忙通过 docker ps -a 查看有两个状态的dead的容器解决方法&#xff1a;1.查看所有挂载的设备2.截取设备的进程id3.清理进程(kill掉即可) 在删除docker容器的时候报错,说设备正忙 Error response from daemon: Driver overlay2 fai…

Linux的ping命令、wget命令、curl命令

一、ping命令 通过ping命令&#xff0c;可以检查指定的网络服务器是否是可联通状态 形式&#xff1a;ping [-c num] ip或主机名 -c&#xff1a;检查的次数&#xff0c;不使用-c&#xff0c;将无限次数持续检查 ip或主机名&#xff1a;被检查的服务器的ip地址或主机名地址 …

AOP(面向切面编程)基于XML方式配置

概念解释&#xff1a;&#xff08;理解基本概念方可快速入手&#xff09; 连接点&#xff08;joinpoint&#xff09; 被拦截到的点&#xff0c;因为Spring只支持方法类型的连接点&#xff0c;所以在Spring中连接点指的就是被拦截到的方法。 切入点&#xff08;pointcut&#x…

系列一、如何正确的获取Spring Cloud Alibaba Spring Cloud Spring Boot之间的版本对应关系

一、正确的获取Spring Cloud Alibaba & Spring Cloud & Spring Boot之间的版本对应关系 1.1、概述 Java发展日新月异&#xff0c;Spring Cloud Alibaba 、 Spring Cloud 、 Spring Boot在GitHub上的迭代也是异常的频繁&#xff0c;这也说明其社区很活跃&#xff0c;通…

【持续学习系列(六)】《iCaRL》

一、论文信息 1 标题 iCaRL: Incremental Classifier and Representation Learning 2 作者 Sylvestre-Alvise Rebuffi, Alexander Kolesnikov, Georg Sperl, Christoph H. Lampert 3 研究机构 University of Oxford/IST Austria 二、主要内容 论文主要探讨了如何开发能…

红队专题-Web安全/渗透测试-文件上传/下载/包含

文件上传/下载/包含 招募六边形战士队员利用目录穿越反弹SHELL实战测试2.2 提交报文修改检测3.2 文件内容检测绕过完整文件结构 检测 第四章&#xff1a;解析漏洞第一节 常见解析漏洞iis/nginx php fastcgi 取值错误 解析漏洞 &#xff08;配置错误&#xff09;nginx 文件名逻…