Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)

news2024/12/26 0:29:55

依赖注入的方式有setter注入、构造器注入、自动装配、集合注入

首先,Maven项目pom.xml依赖包如下:
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring-1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.22.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
    </dependencies>
</project>

【注】:上述除spring依赖包之外其他三个依赖包用于测试使用。

1. setter注入

先说明一下,这里有的文件为Book2Dao(接口)、Book2DaoImpl(Book2Dao接口实现类)、Book2Service(接口)、Book2ServiceImpl(Book2Service即可实现类)、Test2(用于测试)。示例在Book2ServiceImpl类中使用Book2Dao的方法save,如下:

Book2Dao

package com.bh.dao;
public interface Book2Dao {
    void save();
}

Book2DaoImpl

package com.bh.dao.Impl;

import com.bh.dao.Book2Dao;
public class Book2DaoImpl implements Book2Dao {
    public void save() {
        System.out.println(" Book2DaoImpl 已保存数据!");
    }
}

Book2Service

package com.bh.service;

public interface Book2Service {
    void save();
}

Book2ServiceImpl

package com.bh.service.Impl;

import com.bh.dao.Book2Dao;
import com.bh.service.Book2Service;

public class Book2ServiceImpl implements Book2Service {
    private Book2Dao book2Dao;
    public void setBook2Dao(Book2Dao book2Dao) {
        this.book2Dao = book2Dao;
    }
    public void save() {
        book2Dao.save();
    }
}

applicationContext.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"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation=
               "http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd

                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd

">

<!--    开启context的命名空间  -->
     <bean id="book2Dao" class="com.bh.dao.Impl.Book2DaoImpl"/>

    <bean id="book2Service" class="com.bh.service.Impl.Book2ServiceImpl">
        <property name="book2Dao" ref="book2Dao"/>
    </bean>
</beans>

【注】:这个xml文件是开启了context的命名空间的,用于后续操作。
Test2

package com.bh;

import com.bh.service.Book2Service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Book2Service book2Service = ctx.getBean("book2Service", Book2Service.class);
        book2Service.save();
    }
}

运行结果为:
请添加图片描述

这种方式如果在Book2ServiceImpl类中引入多个其他类的依赖时,在配置文件applicationContext.xml上就需要写上对应的property标签,并且一旦Java类上这些引入的依赖变量名称进行修改,对应的配置文件bean标签里的property标签也要进行相应的修改,显得很繁琐,有没有简便的方法呢?有的,那就是使用自动装配
自动装配

只需要修改一下applicationContext.xml配置文件即可。

applicationContext.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"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation=
               "http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd

                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd

">
<!--    开启context的命名空间  -->
     <bean id="book2Dao" class="com.bh.dao.Impl.Book2DaoImpl"/>

    <bean id="book2Service" class="com.bh.service.Impl.Book2ServiceImpl" autowire="byType"/>
</beans>

运行结果和上述一样。
如果在上述applicationContext.xml定义了两个Book2DaoImpl类型相同的bean,则会报错,如下:
请添加图片描述

运行结果:
请添加图片描述
请添加图片描述
从报错信息上分析,是因为我定义了两个class类型相同的bean,而使用的自动装配方式是按类型(byType)进行装配的,我可以修改一下自动装配类型,使用byName按名称,这样就没有问题了,如下:
请添加图片描述
这样修改之后,就能正常运行出结果了。但是使用按名称进行装配,对于bean的id值是有要求的,id值需要与Java类上对应变量名称一致,否则也会出问题。

对于自动装配,总结如下:

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作;
  • 使用按类型装配时,必须保障容器中相同类的bean唯一,推荐使用;
  • 使用按名称装配时,必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用;
  • 自动装配优先级低于setter注入与构造器的注入,同时出现时自动装配失效。

2. 构造器注入

使用构造方法进行注入,原Book2ServiceImpl类修改为:
Book2ServiceImpl

package com.bh.service.Impl;

import com.bh.dao.Book2Dao;
import com.bh.service.Book2Service;

public class Book2ServiceImpl implements Book2Service {
    private Book2Dao book2Dao;
    public Book2ServiceImpl(Book2Dao book2Dao) {
        this.book2Dao = book2Dao;
    }

    public void save() {
        book2Dao.save();
    }
}

上述applicationContext.xml配置文件修改为如下:
在这里插入图片描述
运行结果同上述正常运行结果;
如果构造方法中有简单类型,constructor-arg标签如下:

<constructor-arg name="name" value="liuze"/>

但是这种方式一旦Java类变量名称修改了,配置文件也需要进行相应的名称修改,可以把name属性去掉,用index来代替,index值从0开始,表示Java类构造方法中形参的位置。
请添加图片描述

3. 集合注入

比如在一个Java类中有一些集合类型的变量,如数组、List、Set、Map、Properties,参考示例如下(使用setter注入):
RandomObject

package com.bh.other;

import java.util.*;

public class RandomObject {

    private int[] arrObj;
    private List<String> listObj;
    private Set<String> setObj;
    private Map<String,String > mapObj;
    private Properties propertiesObj;

    public void setArrObj(int[] arrObj) {
        this.arrObj = arrObj;
    }

    public void setListObj(List<String> listObj) {
        this.listObj = listObj;
    }

    public void setSetObj(Set<String> setObj) {
        this.setObj = setObj;
    }

    public void setMapObj(Map<String, String> mapObj) {
        this.mapObj = mapObj;
    }

    public void setPropertiesObj(Properties propertiesObj) {
        this.propertiesObj = propertiesObj;
    }

    public void save(){

        System.out.println("保存数据。。。");
        System.out.println(Arrays.toString(arrObj));
        System.out.println(listObj);
        System.out.println(setObj);
        System.out.println(mapObj);
        System.out.println(propertiesObj);
    }
}

applicationContext.xml配置文件为:

<bean id="randomObject" class="com.bh.other.RandomObject">
    <property name="arrObj">
         <array>
             <value>123</value>
             <value>456</value>
             <value>789</value>
         </array>
     </property>
     <property name="listObj">
         <list>
             <value>abc</value>
             <value>efg</value>
             <value>hij</value>
         </list>
     </property>
     <property name="setObj">
         <set>
             <value>abc</value>
             <value>efg</value>
             <value>hij</value>
             <value>abc</value>
         </set>
     </property>
     <property name="mapObj">
         <map>
             <entry key="name" value="liuze"/>
             <entry key="age" value="22"/>
             <entry key="address" value="hunan"/>
         </map>
     </property>
     <property name="propertiesObj">
         <props>
             <prop key="name">liuze</prop>
             <prop key="age">23</prop>
             <prop key="address">hunan</prop>
         </props>
     </property>
 </bean>

运行结果:
请添加图片描述

怎样利用上述知识对数据源对象进行注入呢?
applicationContext.xml

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc::mysql://localhost:3306/d_test"/>
    <property name="user" value="root"/>
    <property name="password" value="sxx123"/>
</bean>

依旧使用setter注入方式即可,那么怎样加载自定义的properties文件呢?这就是说到开头讲的那个aplicationContext.xml文件了,是不是发现这个文件开头那个看不懂的链接比默认的多了几个,那是用于开启context命名空间的。
现在在resources文件夹有一个jdbc.properties文件如下:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc::mysql://localhost:3306/d_test
jdbc.username=root
jdbc.password=sxx123

aplicationContext.xml如何读取这些数据,如下:
请添加图片描述
运行结果:
请添加图片描述

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

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

相关文章

Servlet中转发和重定向的区别

什么是转发&#xff0c;重定向&#xff1f; 转发和重定向都是用于在服务器和浏览器之间进行页面跳转的方式。 转发是在服务器内部进行的&#xff0c;当一个Servlet接收到请求后&#xff0c;它可以将请求转发给另一个Servlet或JSP页面来处理请求&#xff0c;但是浏览器不知道这…

C语言-学习之路-04

C语言-学习之路-04 数组与字符串一维数组一维数组的定义和使用一维数组的初始化数组名一维数组练习 二维数组二维数组的定义和使用二维数组的初始化数组名 字符数组与字符串字符串的输入输出随机数字符串处理函数 数组与字符串 数组&#xff1a;为了方便处理数据把具有相同类型…

等保工作的定级指南文件

定级主要依据国家标准信息安全技术网络安全等级保护基本要求来整改。有关等保工作流程和明细,请见:https://luozhonghua.blog.csdn.net/article/details/130465356?spm=1001.2014.3001.5502 5网络安全等级保护概述 5.1等级保护对象 等级保护对象是指网络安全等级保护工作中…

微服务注册中心-Nacos概述

1、Nacos基本介绍 1.1. 什么是 Nacos&#xff1f; Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮…

详解Transformer (Attention Is All You Need)

先导知识 Attention残差网络Layer Normalization 前言 注意力&#xff08;Attention&#xff09;机制[2]由Bengio团队与2014年提出并在近年广泛的应用在深度学习中的各个领域&#xff0c;例如在计算机视觉方向用于捕捉图像上的感受野&#xff0c;或者NLP中用于定位关键token…

kvm GPU直通/GPU透传 之修改Windows虚拟机分辨率

为了方便对服务器进行自动管理,我们需要对硬件进行虚拟化。对于显卡而言,Nvidia有专门支持GPU虚拟化的显卡,比如GRID GPU系列。以NVIDIA GRID K2为例,显存8GB,可虚拟出2块GPU。 对于GTX系列的显卡,如果Host主机为linux系统,想将显卡给虚拟机(windows或者linux)使用,…

函数的栈帧与销毁(栈帧可不是战争哦)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将C语言知识一网打尽&#xff0c;希望可…

码出高效:Java开发手册笔记(java对象四种引用关系及ThreadLocal)

码出高效&#xff1a;Java开发手册笔记&#xff08;java对象四种引用关系及ThreadLocal&#xff09; 前言一、引用类型二、ThreadLocal价值三、ThreadLocal副作用 前言 “水能载舟&#xff0c;亦能覆舟。”用这句话来形容 ThreadLocal 最贴切不过。ThreadLocal 初衷是在线程并…

《C和指针》笔记3:置一和清零

在C语言中&#xff0c;移位运算符<<和>>表示二进制数左移或右移&#xff0c;我们可以利用它们很轻松地对变量中单个位进行置一和清零。 我们可以规定变量二进制数最右边一位是第0位&#xff0c;定义bit_number是0&#xff0c;对应地&#xff0c;从最右边一位往左数…

iOS开发系列--打造自己的“美图秀秀”

--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果&#xff0c;一方面得益于成功系统的设计&#xff0c;另一方面得益于它强大的开发框架。今天我们将围绕iOS中两大图形、图像绘图框架进行介绍&#xff1a;Quartz 2D绘制2D图形和Core Image中强大的滤镜功能…

【OpenVinoSharp】基于C#和OpenVINO部署PaddleOCR模型

基于C#和OpenVINO部署PaddleOCR模型 1.OpenVINO2.PaddleOCRPP-OCRv2PP-OCRv3 3.模型下载与转换3.1 Detection model3.2 Direction classifier3.3 Recognition model 4.OpenVinoSharp安装4.1 获取OpenVinoSharp源码4.2 配置OpenVINO依赖项 5. PaddleOCR5. 1模型推理C#实现&#…

Kali 安装中文输入法(超详细)

1.进入管理员下的控制台。 2. 输入密码后点击“授权”。 3.在控制台内输入下面的命令。 apt install fcitx 4.敲击回车后会开始安装&#xff0c;这里输入“y”。 5.回车后会继续进行安装&#xff0c;安装完成后会自动停止。 6.输入下面的命令来安装google输入法。 apt-get in…

【Python】【进阶篇】22、Django模板加载与响应

目录 22、Django模板加载与响应1. 什么是模板1) 模板的配置2) 修改settings配置文件 2. 模板的加载与响应方式3. render方法详解 22、Django模板加载与响应 在前文章节《Django模板系统》中&#xff0c;我们对 Django 的模板系统有了初步的认识&#xff0c;在本章我们将重点讲…

mongodb v4.4.19 分片精进实操,吐血分享

第一步&#xff1a;创建文件夹&#xff0c;data1111存放config server,data2222/data3333存放shard 第二步&#xff1a;启动服务 2.1 启动config server 2.2 启动shard --port 设置端口 --dbpath 设置数据库路径 --logappend 使用追加的方式写日志 --replS…

ReentrantLock原理剖析

前言 本文主要讲解底层逻辑&#xff0c;基本不会贴代码&#xff0c;目的是让大家能够真正的知晓原理&#xff0c;对照着逻辑去理解代码看代码也会很快就能看懂。 在讲ReentrantLock原理之前&#xff0c;我们先回顾下ReentrantLock的基本用法。ReentrantLock是一个锁编程api&am…

Compiler Lab2- 自制极简编译器

笔者实现的这个超级迷你版编译器&#xff08;词法分析、语法分析、生成中间代码&#xff08;cpp&#xff09;&#xff09;仅支持四则运算&#xff0c;功能真的是非常非常简单&#xff0c;不过其中的流程&#xff08;词法分析 -> 语法分析 -> 中间代码生成&#xff09;还是…

各SQL引擎的SQL转换过程对比

SQL引擎 参考文档:高级语言的解析过程—解析树 从 MySQL、Oracle、TiDB、CK,到 Hive、HBase、Spark,从关系型数据库到大数据计算引擎,他们大都可以借助 SQL 引擎,实现 “接受一条 sql 语句然后返回查询结果” 的功能。 他们核心的执行逻辑都是一样的,大致可以通过下面…

【五一创作】《嵌入式系统》知识总结7:GPIO寄存器

总述 每组端口具有7个寄存器 • 实现对GPIO端口初始化配置和数据输入输出控制 1. 配置寄存器&#xff1a;GPIOx_CRL、GPIOx_CRH 用来选择引脚功能&#xff0c;例如输入或输出 2. 数据寄存器&#xff1a;GPIOx_IDR、GPIOx_ODR 用来保存引脚输入电平或输出电平 3. 位控寄存器…

数据库管理-第七十一期 五一,休息?(20230503)

数据库管理 2023-05-03 第七十一期 五一&#xff0c;休息&#xff1f;1 备份2 两个DDL3 问题处理4 问题排查总结 第七十一期 五一&#xff0c;休息&#xff1f; 好不容易&#xff0c;熬过万恶的6天班来到了五一假期&#xff0c;想着好好休息&#xff0c;顺便把绝地幸存者给通关…

Java 基础进阶篇(九)—— 常用 API

文章目录 一、Object 类二、Objects 工具类三、Math 类四、System 类五、BigDecimal 类 一、Object 类 一个类要么默认继承了 Object 类&#xff0c;要么间接继承了 Object 类&#xff0c;Object 类是 java 中的祖宗类。Object 类的方法是一切子类都可以直接使用的。 因此&…