spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))

目录

一、单个字符串或对象引用的注入。

(1)简单案例演示。

1、项目的基本结构和类介绍。

2、接口"UserDao"代码。

3、实现类"UserDaoImpl"代码。

4、spring配置文件。

5、测试类(MainApp)。

6、查看执行结果。(对应成员变量成功注入!)

二、集合类型(对象)注入。

(1)XMind图解。(格式和基本用法)

(2)简单案例演示。

1、项目的基本结构和类介绍。

2、接口"UserDao"代码。

3、实现类"UserDaoImpl"代码。

4、spring配置文件。(此处重点)

5、测试类(MainApp)。

6、查看执行结果。(对应成员变量成功注入!)


  • 若学习《spring容器使用setter、构造器、自动装配方式实现依赖注入》。请前往作者上一篇博客——spring学习(spring-DI(setter注入、构造器注入、自动装配方式))-CSDN博客

一、单个字符串或对象引用的注入。

(1)简单案例演示。
1、项目的基本结构和类介绍。
  • 在UserDaoImpl实现类中。拥有两个成员属性(字符串类型与引用类型(对象))。提供对应的setter方法。提供save()方法,且方法中打印字符串类型与引用类型(对象)的数据。
  • 测试时:通过容器对象获取spring容器管理的"UserDaoImpl"的实例化对象。再调用本身的save方法。save()方法再执行其他逻辑。
  • pom.xml文件中引入spring-context的依赖坐标。



2、接口"UserDao"代码。
  • 提供抽象方法save()。实现类"UserDaoImpl"再去实现save()方法。
package com.fs.dao;

public interface UserDao {
    //UserDao的save方法
    void save();
}
3、实现类"UserDaoImpl"代码。
  • 实现接口"UserDao"并实现其save()方法。
  • 提供成员变量(str(字符串)、user(对象))。且提供相应的setter方法。使用注入的方式获取对应的值和实例化bean。
package com.fs.dao.impl;

import com.fs.dao.UserDao;
import com.fs.entity.User;

public class UserDaoImpl implements UserDao {
    //字符串属性
    String str;
    //类对象属性
    User user;

    public void setStr(String str) {
        this.str = str;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public void save() {
        System.out.println("UserDaoImpl save...");
        //打印注入的字符串属性
        System.out.println(str);
        //打印注入的类对象属性
        System.out.println(user);
        user.setUsername("zhangsan");
        user.setPassword("123456");
        System.out.println("用户名:"+user.getUsername()+",密码:"+user.getPassword());
    }
}
4、spring配置文件。
  • 使用标签<bean>、<property><ref>。以及属性"name"、"value"、"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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!--配置UserDapImpl的bean-->
    <bean id="userDao" class="com.fs.dao.impl.UserDaoImpl">
        <!--使用<property>标签给成员属性赋值-->
        <property name="str" value="helloworld"></property>
        <property name="user">
            <!--使用<ref>标签给引用类型(对象)赋值-->
            <ref bean="user"></ref>
        </property>
    </bean>
    
    <!--配置实体类User对象的bean-->
    <bean id="user" class="com.fs.entity.User"></bean>
</beans>
5、测试类(MainApp)。
  • 使用ApplicationContext容器加载配置文件。再调用容器对象的getBean()方法获取"UserDaoImpl"类的实例化bean。通过该bean对象调用save()方法。
package com.fs.test;

import com.fs.dao.impl.UserDaoImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        //使用IoC容器(ApplicationContext)获取spring容器管理的bean对象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springC.xml");
        //2.通过<bean>标签的唯一标识id获取配置的bean对象
        Object obj = context.getBean("userDao");
        //强制转换
        UserDaoImpl userDao = (UserDaoImpl) obj;
        //调用UserDaoImpl中的save方法
        userDao.save();

    }
}
6、查看执行结果。(对应成员变量成功注入!)

二、集合类型(对象)注入。

(1)XMind图解。(格式和基本用法)


(2)简单案例演示。
1、项目的基本结构和类介绍。
  • 话不多说。拿上面案例简单修改即可,添加几个成员属性再依次通过setter注入即可。
  • 数组对象。int[] array。
  • List集合对象。List<String> list1。List<User> list2。
  • Set集合对象。Set<String> set。
  • Map集合对象。Map<String,String> map。
  • Properties对象:properties。

  • 关于类的代码基本不变化。最大变化——spring配置文件(各种标签的使用)。


2、接口"UserDao"代码。
  • 同样提供抽象方法save()。实现类"UserDaoImpl"再去实现save()方法。
package com.fs.dao;

public interface UserDao {
    //UserDao的save方法
    void save();
}
3、实现类"UserDaoImpl"代码。
  • 同样实现接口"UserDao"并实现其save()方法。
  • 创建需要测试的数组与几个集合的成员变量。并提供相应的setter方法。以便完成相应的值的注入!



  • save()方法除了打印自身需要的外,还需要依次打印对应的数组和几个集合对象的值。因为要测试是否成功的依靠配置文件(spring.xml)完成注入!
package com.fs.dao.impl;
import com.fs.dao.UserDao;
import com.fs.entity.User;

import java.util.*;

public class UserDaoImpl implements UserDao {

    //基本数据类型的数组对象
    private int[] array;

    //List<String>集合对象
    private List<String> list1;
    //List<User>集合对象
    private List<User> list2;

    //Set<String>集合对象
    private Set<String> set;

    //Map<String,String>集合对象
    private Map<String,String> map;

    //Properties类对象
    private Properties properties;

    //提供相应的setter方法


    public void setArray(int[] array) {
        this.array = array;
    }

    public void setList1(List<String> list1) {
        this.list1 = list1;
    }
    public void setList2(List<User> list2) {
        this.list2 = list2;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public void save() {
        System.out.println("UserDaoImpl save...");
        //将数组转换为字符串形式。以便打印!
        System.out.println("遍历数组:"+ Arrays.toString(array));
        //遍历List集合
        System.out.println("遍历list1:"+list1);
        System.out.println("遍历list2:"+list2);
        //遍历Set集合
        System.out.println("遍历Set:"+set);
        //遍历Map集合
        System.out.println("遍历Map:"+map);
        //
        System.out.println("遍历Properties:"+properties);
    }
}
4、spring配置文件。(此处重点)
  • 使用标签<bean>、<property>、<ref>、<array><list><set>、<value>、<map>、<entry>、<props>、<prop>等等。以及属性"key"、"value"、"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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置UserDapImpl的bean-->
    <bean id="userDao" class="com.fs.dao.impl.UserDaoImpl">
        <!--配置成员属性:数组-->
        <property name="array">
            <array>
                <value>666</value>
                <value>888</value>
                <value>999</value>
            </array>
        </property>
        <!--配置成员属性:list集合-->
        <property name="list1">
            <list>
                <value>abc</value>
                <value>hello</value>
                <value>world</value>
            </list>
        </property>
        <property name="list2">
            <list>
                <!--根据不同的id-->
                <ref bean="user"></ref>
                <ref bean="use1"></ref>
                <ref bean="use2"></ref>
            </list>
        </property>
        <!--配置成员属性:Set集合-->
        <property name="set">
            <set>
                <value>lisi</value>
                <value>zhangsan</value>
                <value>wangwu</value>
            </set>
        </property>
        <!--配置成员属性:Map集合-->
        <property name="map">
            <map>
                <entry key="country" value="china"></entry>
                <entry key="province" value="hunan"></entry>
                <entry key="city" value="huaihua"></entry>
            </map>
        </property>
        <!--配置成员属性:Properties对象-->
        <property name="properties">
            <props>
                <prop key="name">hyl</prop>
                <prop key="age">18</prop>
                <prop key="sex">male</prop>
            </props>
        </property>
    </bean>

    <!--配置实体类User对象的bean-->
    <!--为了测试-->
    <bean id="user" class="com.fs.entity.User"></bean>
    <bean id="use1" class="com.fs.entity.User"></bean>
    <bean id="use2" class="com.fs.entity.User"></bean>
</beans>
5、测试类(MainApp)。
  • 使用ApplicationContext容器加载配置文件。再调用容器对象的getBean()方法获取"UserDaoImpl"类的实例化bean。通过该bean对象调用save()方法。save()方法中打印配置文件注入每一个被注入的成员属性。
package com.fs.test;

import com.fs.dao.impl.UserDaoImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        //使用IoC容器(ApplicationContext)获取spring容器管理的bean对象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springC.xml");
        //2.通过<bean>标签的唯一标识id获取配置的bean对象
        Object obj = context.getBean("userDao");
        //强制转换
        UserDaoImpl userDao = (UserDaoImpl) obj;
        //调用UserDaoImpl中的save方法
        userDao.save();

    }
}
6、查看执行结果。(对应成员变量成功注入!)
  • 不必多言。标签使用对,属性设置对,就不会出问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三格电子——新品IE103转ModbusTCP网关

型号&#xff1a;SG-TCP-IEC103 产品概述 IE103转ModbusTCP网关型号SG-TCP-IEC103&#xff0c;是三格电子推出的工业级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于IEC103数据采集、DLT645-1997/2007数据采集&#xff0c;IEC103支持遥测和遥信&#xff0c;可…

leetcode-283.移动零-day13

方法一&#xff1a;双指针遇 0 交换 1. 基本思路回顾 该方法使用了两个指针m和i&#xff0c;m用于标记当前已经处理好的非零元素应该放置的位置&#xff0c;i用于遍历整个数组。当遇到nums[m]为0时&#xff0c;会通过内层while循环找到下一个非零元素&#xff08;如果存在的话…

基于LabVIEW的USRP信道测量开发

随着无线通信技术的不断发展&#xff0c;基于软件无线电的设备&#xff08;如USRP&#xff09;在信道测量、无线通信测试等领域扮演着重要角色。通过LabVIEW与USRP的结合&#xff0c;开发者可以实现信号生成、接收及信道估计等功能。尽管LabVIEW提供了丰富的信号处理工具和图形…

Go怎么做性能优化工具篇之基准测试

一、什么是基准测试&#xff08;Benchmark&#xff09; 在 Go 中&#xff0c;基准测试是通过创建以 Benchmark 开头的函数&#xff0c;并接收一个 *testing.B 类型的参数来实现的。testing.B 提供了控制基准测试执行的接口&#xff0c;比如设置测试执行的次数、记录每次执行的…

Windows下使用git配置gitee远程仓库

目录 使用git配置&#xff08;传统方法&#xff09; 1、在桌面新建一个文件夹 2、git clone [ur1] 3、git branch查看分支 4、git branch新建分支&#xff08;重要&#xff09; 5、git push推送新分支 简单版&#xff08;使用git小乌龟&#xff09; 官网下载&#xff1…

DotNetBrowser 3.0.0 正式发布!

&#x1f6e0;️ 重要消息&#xff1a;DotNetBrowser 3.0.0 正式发布&#xff01; 我们很高兴向您介绍全新的 DotNetBrowser 3.0.0 版本。此次更新带来了多项重要功能与优化&#xff0c;进一步提升了 Web 开发的效率和体验。 &#x1f4e2; DotNetBrowser 3.0.0 包含哪些新功…

【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题

目录 为什么要结合项目与算法&#xff1f; 1. 蓝桥杯与《苍穹外卖》项目的结合 实例&#xff1a;基于蓝桥杯算法思想的订单配送路径规划 问题描述&#xff1a; 代码实现&#xff1a;使用动态规划解决旅行商问题 代码解析&#xff1a; 为什么这个题目与蓝桥杯相关&#x…

严格推导质点曲线运动的运动学方程

前言 相当一部分物理学书籍在推导质点曲线运动的运动学方程时&#xff0c;采用的都是先建立位移的微元 Δ r ⃗ \Delta \vec{r} Δr &#xff0c;然后几何近似求极限的方法。这种方法虽然能得到正确的结论&#xff0c;但数学上的严格性略有欠缺&#xff0c;且过程繁琐。考虑到…

【gym】理解gym并测试gym小游戏CartPole (一)

一、gym与文件位置的联合理解 import gym import inspect# 加载 CliffWalking 环境 env gym.make(CliffWalking-v0)# 获取环境的类 env_class type(env)# 获取环境类所在的文件路径 file_path inspect.getfile(env_class)print(f"The source code for CliffWalking-v0…

Mac升级macOS 15 Sequoia后,无法ssh连接本地虚拟机

现象 macOS 15后&#xff0c;无法ssh连接本地启动的虚拟机&#xff0c;提示错误&#xff1a; No route to host&#xff0c;也ping不通。包括UTM、Parallels Desktop这两个虚拟机软件。之前都是没问题的&#xff0c;通过一些简单排查&#xff0c;目前没发现什么问题。 在虚拟…

vue3 setup模式使用事件总线Event bus用mitt,app.config.globalProperties.$bus

环境介绍package.json中的内容如下 需要 npm install mitt&#xff1a; {"name": "event_bus_test","version": "0.0.0","private": true,"type": "module","scripts": {"dev": &…

【java基础系列】实现一个简单的猜数字小游戏

主要是用的java中的键盘录入和随机数两个api&#xff0c;实现这种人机交互的小游戏&#xff0c;可以用来锻炼基础算法思维 实现效果 实现代码 package com.gaofeng.day10;import java.util.Random; import java.util.Scanner;/*** author gaofeng* date 2024-12-22 - 9:21*/ …

Halcon例程代码解读:安全环检测(附源码|图像下载链接)

安全环检测核心思路与代码详解 项目目标 本项目的目标是检测图像中的安全环位置和方向。通过形状匹配技术&#xff0c;从一张模型图像中提取安全环的特征&#xff0c;并在后续图像中识别多个实例&#xff0c;完成检测和方向标定。 实现思路 安全环检测分为以下核心步骤&…

四、使用langchain搭建RAG:金融问答机器人--构建web应用,问答链,带记忆功能

经过前面3节完成金融问答机器人基本流程&#xff0c;这章将使用Gradio构建web应用&#xff0c;同时加入memory令提示模板带有记忆的&#xff0c;使用LCEL构建问答链。 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingF…

深入理解 Linux wc 命令

文章目录 深入理解 Linux wc 命令1. 基本功能2. 常用选项3. 示例3.1 统计文件的行、单词和字符数3.2 仅统计行数3.3 统计多个文件的总和3.4 使用管道统计命令输出的行数 4. 实用案例4.1 日志分析4.2 快速统计代码行数4.3 统计单词频率 5. 注意事项6. 总结 深入理解 Linux wc 命…

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

mysql-主从同步与读写分离

一、mysql主从同步原理 mysql主从是用于数据灾备。也可以缓解服务器压力(读写分离)&#xff0c;即为主数据库服务器增加一个备服务器&#xff0c; 两个服务器之间通过mysql主从复制进行同步&#xff0c;这样一台服务器有问题的情况下可以切换到另一台服务器继续使用。 如何想实…

在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。

在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。以下是关于这两种方法的详细解释: 一、虚方法(Virtual Method) 定义:虚方法是指在运行时由实例的实际类型决定的方法。在Java中,所有的非私有、非静态、非final方法都是虚方法。当调用一个虚方法时,JVM会根据实…

【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结

文章目录 生产者端&#xff08;消息发布端&#xff09;保证机制RabbitMQ服务器端保证机制消费者端&#xff08;消息接收端&#xff09;保证机制除了MQ自带的机制&#xff0c;还能做的操作持久化的原理ACK思想 更多相关内容可查看 消息从发送&#xff0c;到消费者接收&#xff0…

重拾设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…