spring基于XML方式的组件管理

news2025/1/19 17:11:29

基本介绍

依赖注入是一种处理对象间依赖关系的技术。在Spring中,依赖注入有构造方法注入和设值注入两种方式。

  • 设值注入是将依赖作为成员变量,通过主调类的setter方法注入依赖。
  • 构造方法注入则是在Bean的构造方法中注入依赖。

本次我们将通过具体例子来讲解这两种方式。
果汁店(juiceMaker)通过顾客的信息单(List)来生产饮品。
caseA - 取餐号001 ,橙汁,少糖,大杯
caseB- 取餐号002 ,贡茶,无糖,中杯


目录

  • 基本介绍
  • 一、环境准备
    • 1.1,maven配置
  • 二、构造方法注入
    • 2.1,基本组件类——ListA
    • 2.2,基本组件类——MakerA
    • 2.3,XML配置
    • 2.4,测试
  • 三、设值注入
    • 3.1,基本组件类——ListB
    • 3.2,基本组件类——MakerB
    • 3.3,XML配置
    • 3.4,测试
  • 总结


一、环境准备

1.1,maven配置

 <dependencies>
        <!--spring context依赖-->
        <!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.6</version>
        </dependency>
        <!--junit5测试-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.3.1</version>
        </dependency>
    </dependencies>

二、构造方法注入

IoC容器在实例化Bean的过程中,会根据Bean的定义中的属性,查找并注入依赖。如果Bean定义中指定了构造函数,IoC容器会调用该构造函数,并将需要的依赖作为参数传递给该构造函数

2.1,基本组件类——ListA

1,此类的属性,fruit_sort,fruit_sugar,fruit_size。
2,toString方法方便测试。
3,构造方法ListA,上的@ConstructorProperties在测试中解释。

package com.zjr.list;

import java.beans.ConstructorProperties;

/**
 *  果汁的信息单
 */
public class ListA {
    private String fruit_sort;
    private String fruit_sugar;
    private String fruit_size;

    @Override
    public String toString() {
        return "ListA{" +
                "fruit_sort='" + fruit_sort + '\'' +
                ", fruit_sugar='" + fruit_sugar + '\'' +
                ", fruit_size='" + fruit_size + '\'' +
                '}';
    }
    @ConstructorProperties({"fruit_sort","fruit_sugar","fruit_size"})
    public ListA(String fruit_sort, String fruit_sugar, String fruit_size){
        this.fruit_sort = fruit_sort;
        this.fruit_sugar = fruit_sugar;
        this.fruit_size = fruit_size;
    }

}

2.2,基本组件类——MakerA

1,doWork方便测试
2,构造函数MakerA

package com.zjr.juiceMaker;

import com.zjr.list.ListA;

/**
 * 基于构造函数的依赖注入
 */
public class MakerA {
    private ListA listA;

    public String customNumber;

    public MakerA(ListA listA,String customNumber){
        this.listA = listA;
        this.customNumber = customNumber;
    }
    public void doWork(){
        System.out.println("请"+customNumber+"号顾客取餐 --"+listA.toString());
    }
}

2.3,XML配置

  • id:这是Bean的唯一标识符,当你在其他地方引用这个Bean时,你会使用这个ID。
  • class:定义Bean的类型,这是完全限定名,包括包名和类名。
  • constructor-arg:当Bean是通过构造函数注入时,你可以使用constructor-arg来指定构造函数参数的值或引用其Bean。其中index: 参数在构造函数参数列表中的位置索引。type: 参数类型。name: 参数名称。
  • ref:这是对其他Bean的引用,它允许你引用已经在IoC容器中定义的其他Bean(无需被引用的bean先定义,因为spring会先把所有的bean定义,后进行依赖注入)。
  • value:用于直接指定一个值,这个值会被赋给相应的属性或构造函数参数。
<?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">

    <!--声明listA为bean-->
    <bean id="listA" class="com.zjr.list.ListA">
        <constructor-arg name="fruit_sort" value="橙汁"></constructor-arg>
        <constructor-arg name="fruit_sugar" value="少糖"></constructor-arg>
        <constructor-arg name="fruit_size" value="小杯"></constructor-arg>
    </bean>
    <!--声明MakerA为bean-->
    <bean id="makerA" class="com.zjr.juiceMaker.MakerA">
        <constructor-arg name="listA" ref="listA"></constructor-arg>
        <constructor-arg name="customNumber" value="001"></constructor-arg>
    </bean>

</beans>

2.4,测试

在maven工程的测试类中新建一个测试类,写入测试方法如下代码。以下代码采用IOC接口ApplicationContext,实现方法是ClassPathXmlApplicationContext。

import com.zjr.juiceMaker.MakerA;
import com.zjr.juiceMaker.MakerB;
import com.zjr.list.ListA;
import com.zjr.list.ListB;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test_makerA {
    /**
     * 测试由JuiceA.xml配置的bean是否可以正常使用
     * 使用IOC容器接口ApplicationContext 接口实现方法为 类路径配置xml实现
     * 从IOC接口的实例化对象中调用bean,getBean(bean的id,bean的类)
     */
    @Test
    public void testA(){
        ApplicationContext context = new ClassPathXmlApplicationContext("JuiceA.xml");
        ListA listA = context.getBean("listA",ListA.class);
        MakerA makerA = context.getBean("makerA",MakerA.class);
        makerA.doWork();
        System.out.println("信息--"+listA.toString());
    }
}

  • 测试结果
    在这里插入图片描述
  • 测试结果分析
    测试结果的数据符合预期结果。但是出现警告,该警告是因为Java 代码在编译后,默认是不保留方法的参数名称的,解决方法在组件类的构造方法上加入@ConstructorProperties({“name1”,“name2”})注释,在ListA中加入了该注释没有报警告,但是makerA中没有加就报警告了,如下图。在这里插入图片描述

三、设值注入

设值注入是指通过setter方法传入被调用者的实例,从而实现依赖注入的一种方式。这种方式简单、直观,因此在Spring的依赖注入中大量使用。

3.1,基本组件类——ListB

package com.zjr.list;
public class ListB {
    private String fruit_sort;
    private String fruit_sugar;
    private String fruit_size;
    
    @Override
    public String toString() {
        return "ListB{" +
                "fruit_sort='" + fruit_sort + '\'' +
                ", fruit_sugar='" + fruit_sugar + '\'' +
                ", fruit_size='" + fruit_size + '\'' +
                '}';
    }

//set方法
    public void setFruit_sort(String fruit_sort) {
        this.fruit_sort = fruit_sort;
    }
    public void setFruit_sugar(String fruit_sugar) {
        this.fruit_sugar = fruit_sugar;
    }
    public void setFruit_size(String fruit_size) {
        this.fruit_size = fruit_size;
    }
}

3.2,基本组件类——MakerB

package com.zjr.juiceMaker;


import com.zjr.list.ListB;

/**
 * 基于setter方法的依赖注入
 */
public class MakerB {
    private ListB listB;
    public String customNumber;

    public void setListB(ListB listB){
        this.listB = listB;
    }
    public void setCustomNumber(String customNumber){
        this.customNumber = customNumber;
    }
    public void doWork(){
        System.out.println("请"+customNumber+"号顾客取餐");
    }
}

3.3,XML配置

  • 其他标签参考2.3,这里介绍property
  • 标签用于配置bean对象的属性,标签中的name属性表示要注入的bean属性名称,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">
    <!--声明listA为bean-->
    <bean id="listB" class="com.zjr.list.ListB">
        <property name="fruit_sort" value="贡茶"></property>
        <property name="fruit_sugar" value="无糖"></property>
        <property name="fruit_size" value="中杯"></property>
    </bean>
    <!--声明MakerB为bean-->
    <bean id="makerB" class="com.zjr.juiceMaker.MakerB">
        <property name="listB" ref="listB"></property>
        <property name="customNumber" value="002"></property>
    </bean>
</beans>

3.4,测试

测试代码如下所示

import com.zjr.juiceMaker.MakerB;
import com.zjr.list.ListA;
import com.zjr.list.ListB;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class testMakerB {
    /**
     * 测试由JuiceB.xml配置的bean是否可以正常使用
     * 使用IOC容器接口ApplicationContext 接口实现方法为 类路径配置xml实现
     * 从IOC接口的实例化对象中调用bean,getBean(bean的id,bean的类)
     */
    @Test
    public void testB(){
        ApplicationContext context = new ClassPathXmlApplicationContext("JuiceB.xml");
        ListB listB = context.getBean("listB",ListB.class);
        MakerB makerB = context.getBean("makerB",MakerB.class);
        makerB.doWork();
        System.out.println("信息--"+listB.toString());
    }
}

  • 测试结果
    在这里插入图片描述
  • 测试结果分析
    测试结果符合预期,成功调用了IOC所管理的bean以及使用其方法doWork。

总结

本次所举的例子也可以联系三层架构,控制层调用业务层,业务层调用数据层,然后把各层的各个组件配置进IOC容器,并完成DI。欢迎评论区交流。

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

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

相关文章

大白话讲清楚:什么是 Langchain 及其核心概念

在AI和机器学习领域&#xff0c;每天都有新技术和框架涌现。今天&#xff0c;我们来聊聊最近引起广泛关注的一个框架 —— Langchain。 https://python.langchain.com/docs/get_started/introduction 那么&#xff0c;Langchain到底是什么&#xff0c;它为什么这么受欢迎&#…

[NAND Flash 6.4] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​全文 6000 字 内容摘要 NAND Flash 引脚功能 读操作步骤 NAND Flash中的特殊硬件结构 NAND Flash 读写时的数据流向 Read 操作时序 读时序操作过…

测试SpringBoot的时候报错mapper未装载的解决方案:

1.报错信息和截图&#xff1a; org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name com.tang.testspringboot.TestSpringBootApplicationTests: Unsatisfied dependency expressed through field mapper: No qualifying bean o…

SAM:segment anything model——一个通用的图像分割基础模型

文章目录 一、Segment Anything Task二、SAM模型的架构&#xff08;一&#xff09;图像编码器image encoder&#xff08;二&#xff09;prompt encoder&#xff08;三&#xff09;mask decoder 三、SAM 模型的思想&#xff08;一&#xff09;Transformer的自注意力机制&#xf…

Oracle-数据库性能变慢问题分析

问题背景: 应用运维报障说最近两天业务数据入库和表查询都变得很慢&#xff0c;需要排查一下数据库的性能问题 问题分析&#xff1a; 登录到服务器上&#xff0c;通过TOP命令快速看了一下&#xff0c;服务器整体的CPU使用%usr不算特别高&#xff0c;但%wa IO等待很高&#xff…

数据库与SQL

数据库与SQL 学习链接数据库关系型数据库管理系统&#xff08;RDBMS&#xff09; SQLSQL介绍SQL类型SQL 基础语言学习创建表&#xff08;create table&#xff09;语法 数据类型SQL最常用的数据类型 学习链接 基础篇&#xff1a;数据库 SQL 入门教程 数据库 用于存储数据 存放…

centos下系统全局检测工具dstat使用

目录 一&#xff1a;没有需要安装 二&#xff1a;dstat命令参数 三、监测界面各参数含义&#xff08;部分&#xff09; 四、dstat的高级用法 一&#xff1a;没有需要安装 yum install dstat 二&#xff1a;dstat命令参数 有默认选项&#xff0c;执行dstat命令不加任何参数…

docker完成redis 三主三从

文章目录 关闭防火墙启动docker后台服务新建6个docker容器redis实例创建并运行docker容器实例 进入容器redis-node-1并为6台机器构建集群关系链接进入6381作为切入点&#xff0c;查看集群状态主从容错切换迁移案例容错切换迁移 主从扩容案例为主节点6387分配从节点6388主从缩容…

第二十八周:文献阅读笔记(弱监督学习)+ pytorch学习

第二十八周&#xff1a;文献阅读笔记&#xff08;弱监督学习&#xff09; 摘要Abstract1. 弱监督学习1.1. 文献摘要1.2. 引言1.3. 不完全监督1.3.1. 主动学习与半监督学习1.3.2. 通过人工干预1.3.3. 无需人工干预 1.4. 不确切的监督1.5. 不准确的监督1.6. 弱监督学习的创新点 2…

List集合遍历过程中修改元素(有坑)

说来惭愧&#xff0c;学 java 2年了&#xff0c;对 “Java是值传递” 这句话还没有理解它的精髓&#xff0c;以至于编程的时候出现了一些错误&#xff0c;这里记录一下。 一.问题再现 1.1将List集合中的每个字符串更改为其他值 1.2将List集合中的对象更改为其他对象 二.问题分…

Socket编程-IO模型

1、首先IO模型的内容。 感觉可以简单理解为&#xff1a;我们写代码时&#xff0c;在基础的 IO 操作上做了一些其他的策略&#xff0c;根据策略的不同&#xff0c;一般有阻塞IO和非阻塞IO 1、阻塞IO 就是在操作的时候&#xff0c;比如网络通信中&#xff0c;某一线程使用下面这…

【Web】CTFSHOW PHP特性刷题记录(全)

知其然知其所以然&#xff0c;尽量把每种特性都详细讲明白。 目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 web102 web103 web104 web105 web106 web107 web108 web109 web110 web111 web112 web113 web…

【QML COOK】- 007-Item对象、信号和槽

信号&#xff08;signal&#xff09;和槽&#xff08;slot&#xff09;是Qt的独特的设计&#xff0c;自然在QML中也被支持。 Item是QML所有类型的基类&#xff0c;Item类型不会显示在窗口上&#xff0c;但是可以支持信号和槽。本节就用Item编写一个信号和槽的实例。 1. 创建Q…

【Spring 篇】走进SpringMVC的世界:舞动Web的激情

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇关于SpringMVC的博客&#xff0c;让我们一起探索这个舞动Web的框架&#xff0c;感受它带来的激情和便利。在这个世界里&#xff0c;我们将学到SpringMVC的概述、开发步骤以及如何快速入门&#xff0c;一切都是如此的令人兴奋…

数据分析实战丨基于flask+pygal可视化分析sqlite中的数据

文章目录 写在前面实验目标项目框架实验内容1.配置实验环境2.查看sqlite3数据库的数据3.创建项目文件4.编写代码5.运行项目 运行结果写在后面 写在前面 本期内容&#xff1a; 基于FlaskPygal可视化分析Sqlite3中的数据 实验环境&#xff1a; pythonpygalflask 项目下载地址…

Cocos 使用VsCode调试-跨域问题

解决方案&#xff1a; 在添加完debug配置后 在项目文件夹中打开vscode然后找到launch.json 这个runtimeArgs参数在原本的配置中是没有的,给他添加上去 "runtimeArgs": ["--disable-web-security" ] 原理: 禁用浏览器跨域检查&#xff08;仅用于调试&…

msvcp140.dll丢失的常见问题,msvcp140.dll丢失的几种解决办法分享

在电脑系统中&#xff0c;msvcp140.dll是一个重要的系统文件&#xff0c;其作用是为应用程序提供所需的功能和支持。然而&#xff0c;有时候我们可能会遇到msvcp140.dll文件丢失的情况&#xff0c;导致我们无法正常使用某些程序或游戏。本文将介绍msvcp140.dll丢失的常见问题、…

polar CTF 写shell

一、题目 <?php /*PolarD&N CTF*/highlight_file(__FILE__);file_put_contents($_GET[filename],"<?php exit();".$_POST[content]);?>二、解题 payload ?filenamephp://filter/convert.base64-decode/resourceshell.php #<?eval($_POST[1]);…

openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞

文章目录 openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞197.1 分析查询语句是否被阻塞197.1.1 问题现象197.1.2 原因分析197.1.3 处理办法 openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞 197.…

【LV12 DAY17-18 中断处理】

GPX1_1是外部中断9 EINT9 查询可知其中断ID是57 所以需要进行人为修正lr的地址 sub lr&#xff0c;lr&#xff0c;#4 //iqr异常处理程序 irq_handler: //IRQ异常后LR保存的地址是被IRQ打断指令的下一条再下一条指令的地址&#xff0c;所以我们需要人为进行修正一下sub LR,L…