spring基于XML方式的组件管理

基本介绍

依赖注入是一种处理对象间依赖关系的技术。在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。欢迎评论区交流。

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

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

相关文章

【数据库】MySQL性能分析和优化

导语 当数据量非常庞大时,使用MySQL进行select操作可能会出现耗时特别多的情况。例如:在一张百万数据的表格good中执行select * from good;查询耗时可能需要十几秒,让客户等待十几秒,是不被接受的, 此时我们就需要对相关语句进行性能分析并优化。下面就一起看一下MySQL的…

NLP论文阅读记录 - 2022 W0S | 基于Longformer和Transformer的提取摘要层次表示模型

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 A Hierarchical Representation Model Based on Longformer and …

鸿蒙应用开发尝鲜:初识HarmonyOS

初识HarmonyOS 来源:华为官方网站 : https://developer.huawei.com/ 相信大家对鸿蒙应用开发也不在陌生,很多身处互联网行业或者不了解的人们现在也一定都听说过华为鸿蒙.这里我将不再说废话,直接步入正题 鸿蒙应用开发语言 HarmonyOS应用开发采用的是ArkTS语言,ArkTS是在Typ…

WEB前端人机交互导论实验-实训2格式化文本、段落与列表

1.项目1 文本与段落标记的应用&#xff1a; A.题目要求: B.思路&#xff1a; &#xff08;1&#xff09;首先&#xff0c;HTML文档的基本结构是通过<html>...</html>标签包围的&#xff0c;包含了头部信息和页面主体内容。 &#xff08;2&#xff09;在头部信息…

深度学习中的稀疏注意力

稀疏注意力 文章目录 一、稀疏注意力的特点 1. 单头注意力&#xff08;Single-Head Attention&#xff09; 2. 多头注意力&#xff08;Multi-Head Attention&#xff09; 3. 稀疏注意力&#xff08;Sparse Attention&#xff09; 二、稀疏注意力的示意图 三、与Flash Attention…

HTML--CSS--字体、文本样式

字体样式 属性作用font-family字体类型font-size字体大小font-weight字体粗细font-style字体风格color字体颜色 font-family 字体类型 用法&#xff1a; 如下&#xff0c;定义 div元素内的字体&#xff0c;默认是宋体&#xff0c;要设定其他字体就用这个属性进行设定&#x…

汽车ECU的虚拟化技术初探(四)--U2A内存管理

目录 1.内存管理概述 2. 内存保护功能 2.1 SPID 2.2 Slave Guard 3.小结 1.内存管理概述 为了讲清楚U2A 在各种运行模式、特权模式下的区别&#xff0c;其实首先应该搞清楚不同模式下可以操作的寄存器有哪些。 但是看到这个寄存器模型就头大。 再加上之前没有研究过G4MH…

CSS 雷达监测效果

<template><view class="center"><view class="loader"><view></view></view></view></template><script></script><style>/* 设置整个页面的背景颜色为深灰色 */body {background-col…

[NSSCTF Round#16 Basic]RCE但是没有完全RCE

[NSSCTF Round#16 Basic]RCE但是没有完全RCE 第一关 <?php error_reporting(0); highlight_file(__file__); include(level2.php); if (isset($_GET[md5_1]) && isset($_GET[md5_2])) {if ((string)$_GET[md5_1] ! (string)$_GET[md5_2] && md5($_GET[md…

【AIGC】AnimateDiff:无需定制化微调的动画化个性化的文生图模型

前言 Animatediff是一个有效的框架将文本到图像模型扩展到动画生成器中&#xff0c;无需针对特定模型进行调整。只要在大型视频数据集中学习到运动先验知识。AnimateDiff就可以插入到个性化的文生图模型中&#xff0c;与Civitai和Huggingface的文生图模型兼容&#xff0c;也可…

docker部署私人云盘

目录 1.安装 2.登陆 1.安装 mkdir -p /opt/alist docker run -d --restartalways -v /opt/alist:/opt/alist/data -p 5244:5244 --name"alist" xhofe/alist:latest 2.登陆 ip:5224 默认账户admin 密码在日志中

逆水行舟 不进则退

目录 一、前言 二、2023年度总结 三、2024展望未来 一、前言 这是我从工作以来到现在最喜欢的一句话&#xff0c;我想把这句话送给自己也想送给大家。 2019年7月实习到现在已经过去了四年多&#xff0c;进入2024年也迎来了我工作生涯的第五个年头。 在这个行业里&#xff…

《教育界》期刊怎么投稿发表论文?

《教育界》是国家新闻出版总署批准的正规教育类期刊&#xff0c;由广西师范大学主管&#xff0c;广西师范大学出版社集团有限公司主办&#xff0c;面向国内外公开发行&#xff0c;旨在追踪教育新动向&#xff0c;探讨教育改革与管理、办学与教育教学经验等&#xff0c;为广大一…

Linux scp命令 服务器之间通讯

目录 一. scp命令简介二. 本地服务器文件传输到远程服务器三. 本地服务器文件夹传输到远程服务器 一. scp命令简介 scp&#xff08;Secure Copy Protocol&#xff09;是用于在Unix或Linux系统之间安全地复制文件或目录的命令。 它使用SSH&#xff08;Secure Shell&#xff09;…

等保测评流程是什么样的?测评周期多久?

等保测评流程是什么样的&#xff1f;测评周期多久&#xff1f; 等保测评一般分成五个阶段&#xff0c;定级、备案、测评、整改、监督检查。 1.定级阶段 针对用户的信息系统有等保专家进行定级&#xff0c;一般常见的系统就是三级系统或者是二级系统。在这里有一个小的区分&am…

【ArcGIS微课1000例】0088:计算城市建筑物朝向(矩形角度)

文章目录 一、实验描述二、实验数据三、角度计算1. 添加字段2. 计算角度四、方向计算一、实验描述 矩形要素具有长轴和短轴,其长轴方向也称为矩形面的主角度,可用于确定面要素的走向趋势。根据该方向参数,可以对具有矩形特征的地理对象进行方向分析,且适用于很多应用场景,…

8.1 Centos安装部署Redis

文章目录 前言一、下载Redis二、编译Redis三、配置redis.conf四、启动Redis服务端五、启动Redis客户端测试前言 本文将手把手演示在CentOS7上安装部署Redis。 一、下载Redis 可以使用wget命令进行下载,这里下载到/app目录 wget http://download.redis.io/releases/redis-5.…

Python爬虫学习笔记(一)---Python入门

一、pycharm的安装及使用二、python的基础使用1、字符串连接2、单双引号转义3、换行4、三引号跨行字符串5、命名规则6、注释7、 优先级not>and>or8、列表&#xff08;list&#xff09;9、字典&#xff08;dictionary&#xff09;10、元组&#xff08;tuple&#xff09;11…

计算机毕业设计 | SpringBoot+vue的医院门诊预约挂号系统(附源码)

1&#xff0c;绪论 项目背景 预约挂号&#xff0c;挂专家号更是“一号难求”&#xff0c;这是当前许多大型医院的普遍现象。预约挂号是各地近年来开展的一项便民就医服务&#xff0c;旨在缩短看病流程&#xff0c;节约患者时间。这种预约挂号大多通过医疗机构提供的电话或者网…

视频号小店发展前景怎样?适合新手入驻吗?

我是电商珠珠 视频号于22年7月发展了属于自己的平台-视频号小店。作为一个发展了才一年的平台来说&#xff0c;很多人都不敢入驻&#xff0c;害怕它很快就会垮掉。 我们团队在22年10月的时候&#xff0c;开始入驻其中。发现它的玩法和抖音小店相比并没有什么两样。 在刚开始…