【Spring】基于XML的Spring容器配置——<bean>标签与属性解析

Spring框架是一个非常流行的应用程序框架,它通过控制反转(IoC)和依赖注入(DI)来简化企业级应用的开发。Spring容器是其核心部分,负责管理对象的创建、配置和生命周期。在Spring中,XML配置是一种传统而有效的方式来定义和配置Bean(即Spring管理的对象)。

在实际应用中,使用XML配置的场景仍然非常普遍,尤其是在一些大型企业应用中,开发团队可能会选择使用XML来清晰地定义Bean之间的关系和依赖。这种方式具有良好的可读性和可维护性,特别是在团队协作和配置文件版本控制的情况下。

理论知识

1. Spring容器

Spring容器是Spring框架的核心,负责管理应用程序中的对象(Bean)。它通过配置文件来定义Bean的属性和依赖关系,并负责创建、初始化和销毁这些Bean。Spring容器有多种实现方式,其中XML配置是最早和最常用的方式之一。

2. 标签

在XML配置中,<bean>标签用于定义一个Spring Bean。每个<bean>标签可以包含多个属性,这些属性可以用来配置Bean的依赖关系、初始化方法、销毁方法等。

基本语法

<bean id="beanName" class="com.example.BeanClass">
    <property name="propertyName" value="propertyValue"/>
</bean>
  • id:Bean的唯一标识符。

  • class:Bean的完全限定类名。

  • <property>:用于设置Bean的属性。

3. 属性解析

属性解析是指在XML中如何配置Bean的属性。Spring支持多种类型的属性,包括基本数据类型、引用其他Bean、集合类型等。下面我们将详细探讨这些属性的配置方式。

示例代码

1. 创建一个简单的Bean

首先,我们定义一个简单的Java类Person,它有两个属性:nameage

// Person.java
public class Person {
    private String name;
    private int age;

    // Getter和Setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // 打印Person信息
    public void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}
2. XML配置文件

接下来,我们创建一个XML配置文件beans.xml,在其中定义Person Bean。

<!-- beans.xml -->
<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">

    <bean id="person" class="com.example.Person">
        <property name="name" value="Alice"/>
        <property name="age" value="30"/>
    </bean>
</beans>

解释

  • 在这个XML配置中,我们定义了一个ID为person的Bean,类为com.example.Person

  • 通过<property>标签,我们设置了nameage属性的值。

3. 使用Spring容器加载Bean

现在我们可以使用Spring容器来加载这个Bean并调用其方法。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 创建ApplicationContext容器
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        
        // 获取Bean实例
        Person person = (Person) context.getBean("person");
        
        // 调用方法
        person.displayInfo();
    }
}

解释

  • 我们使用ClassPathXmlApplicationContext来加载beans.xml配置文件。

  • 通过context.getBean("person")获取person Bean的实例,并调用displayInfo方法打印信息。

复杂属性解析

1. 引用其他Bean

假设我们有一个Address类,Person类需要引用这个Address类。

// Address.java
public class Address {
    private String city;
    private String country;

    // Getter和Setter方法
    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}

XML配置

<bean id="address" class="com.example.Address">
    <property name="city" value="New York"/>
    <property name="country" value="USA"/>
</bean>

<bean id="person" class="com.example.Person">
    <property name="name" value="Alice"/>
    <property name="age" value="30"/>
    <property name="address" ref="address"/> <!-- 引用Address Bean -->
</bean>

Person类修改

public class Person {
    private String name;
    private int age;
    private Address address; // 新增属性

    // Getter和Setter方法
    // ...

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
        System.out.println("Address: " + address.getCity() + ", " + address.getCountry());
    }
}

2. 集合类型属性

如果Person类有一个兴趣爱好的列表,可以使用集合类型来配置。

import java.util.List;

public class Person {
    private String name;
    private int age;
    private List<String> hobbies; // 新增属性

    // Getter和Setter方法
    // ...

    public List<String> getHobbies() {
        return hobbies;
    }

    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }

    public void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
        System.out.println("Hobbies: " + String.join(", ", hobbies));
    }
}

XML配置

<bean id="person" class="com.example.Person">
    <property name="name" value="Alice"/>
    <property name="age" value="30"/>
    <property name="hobbies">
        <list>
            <value>Reading</value>
            <value>Traveling</value>
            <value>Cooking</value>
        </list>
    </property>
</bean>

生活中的比喻

可以将Spring的XML配置比作一个建筑蓝图:

  • 建筑蓝图:在建筑中,蓝图详细地描述了建筑的结构、材料和布局。类似地,Spring的XML配置文件定义了应用程序中各个Bean的结构、属性和依赖关系。

  • 施工过程:在施工过程中,工人根据蓝图搭建建筑。Spring容器根据XML配置创建和管理Bean的生命周期。

总结

通过以上的介绍和示例,我们深入探讨了Spring基于XML的容器配置,特别是<bean>标签及其属性解析的使用。我们学习了如何定义简单Bean、引用其他Bean以及使用集合类型属性。这些知识对于理解和使用Spring框架至关重要,能够帮助开发者在实际项目中更好地管理和配置Bean,提高代码的可维护性和可读性。

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

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

相关文章

Datawhale AI 冬令营学习笔记-零编程基础制作井字棋小游戏

井字棋小游戏是通过豆包MarsCode实现的&#xff0c;没有改动任何的代码&#xff0c;全部是通过对话让AI进行优化和改进。 开始进入正题&#xff1a;进入豆包MarsCode在线IDE&#xff0c;直接点击上方蓝字&#xff0c;或复制链接打开: 豆包 MarsCode - 编程助手。 IDE界面&…

vscode+编程AI配置、使用说明

文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码&#xff08;Baidu Comate&#xff09;3.1 配置3.2 使用文档3.3 使用说明 4、豆包&#xff08;MarsCode&#xff09;4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码&#xff08;TONGYI Lin…

Redis数据结构和内部编码以及单线程架构

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Redis数据结构和内部编码以及单线程架构 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

虚拟机Hyper-V,安装网络宝塔Docker

我下载的是centos-min大小1G&#xff0c;安装后没网络&#xff0c; 关闭防火墙&#xff0c;网络&#xff0c;修改onBootyes,这里需要看下network-Scripts下有什么文件。 然后就可以访问网络了 虚拟机的设置也是默认就好 网络需要设置允许共享-重要 urlhttps://download.bt.cn/i…

红魔电竞PadPro平板解BL+ROOT权限-KernelSU+LSPosed框架支持

红魔Padpro设备目前官方未开放解锁BL&#xff0c;也阉割了很多解锁BL指令&#xff0c;造成大家都不能自主玩机。此规则从红魔8开始&#xff0c;就一直延续下来&#xff0c;后续的机型大概率也是一样的情况。好在依旧有开发者进行适配研究&#xff0c;目前红魔PadPro平板&#x…

Linux-----进程处理(文件IO资源使用)

下面代码是通过父进程和子进程对同一个文件IO资源进行操作&#xff0c;父进程和子进程都对这个进程进行写入操作&#xff0c;我们都知道这两个进程实际上是并发的&#xff0c;所以需要一个同步机制来去操作同一个资源&#xff08;后面再深入去说明同步的api&#xff0c;这里使用…

EdgeX Core Service 核心服务之 Core Command 命令

EdgeX Core Service 核心服务之 Core Command 命令 一、概述 Core-command(通常称为命令和控制微服务)可以代表以下角色向设备和传感器发出命令或动作: EdgeX Foundry中的其他微服务(例如,本地边缘分析或规则引擎微服务)EdgeX Foundry与同一系统上可能存在的其他应用程序…

【LeetCode】94.二叉树的中序遍历

题目链接&#xff1a; 94.二叉树的中序遍历 题目描述&#xff1a; 题解&#xff1a;&#xff08;递归算法实现二叉树中序遍历&#xff09; 二叉树的中序遍历&#xff1a;按照访问左子树——根节点——右子树的方式遍历这棵树&#xff0c;而在访问左子树或者右子树的时候我们按…

LeetCode:404.左叶子之和

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;404.左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: …

AI对话机器人简单实现--智谱BigModel+SpringBoot+Vue2+ElementUI

成品展示 一、首先去注册个账号然后申请个API keys 二、引入依赖 <dependency><groupId>cn.bigmodel.openapi</groupId><artifactId>oapi-java-sdk</artifactId><version>release-V4-2.3.0</version></dependency><depend…

每天40分玩转Django:Django静态文件

Django静态文件 一、今日学习内容概述 学习模块重要程度主要内容静态文件配置⭐⭐⭐⭐⭐基础设置、路径配置CDN集成⭐⭐⭐⭐⭐CDN配置、资源优化静态文件处理⭐⭐⭐⭐压缩、版本控制部署优化⭐⭐⭐⭐性能优化、缓存策略 二、基础配置 # settings.py import os# 静态文件配置…

改进爬山算法之一:随机化爬山法(Stochastic Hill Climbing,SHC)

随机化爬山法(Stochastic Hill Climbing),也被称为随机爬山法,是一种基于搜索算法的优化方法,是爬山算法的一个变种,它通过引入随机性来减少算法陷入局部最优解的风险,并增加搜索解空间的能力。这种方法特别适合于解决那些具有多个局部最优解的优化问题。 一、算法思想 …

农家乐系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…

《Java源力物语》-3.空值猎手

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” \quad 夜色渐深&#xff0c;在一处偏僻小径上&#xff0c;月光透过浓密的源力云层&#xff0c;在地面上投下斑驳的光影。String正独自练习着刚从…

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development&#xff08;开发&#xff09;和Operations&#xff08;运维&#xff09;的组合&#xff0c;是一种新的软件工程理念&#xff0c;旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式&#xff0c;强调端到端高效一致的交付流程&#xff0c;实…

使用 OpenCV 在图像中添加文字

在图像处理任务中&#xff0c;我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数&#xff0c;可以很方便地在图像上绘制文本&#xff0c;支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字&#xff0c;介绍 cv2.putTe…

接口测试Day-02-安装postman项目推送Gitee仓库

postman安装 下载 Postman&#xff08;已提供安装包&#xff0c;此步可以跳过&#xff09; https://www.postman.com/downloads/安装 Postman 安装Postman插件newman 要想给 postman 安装 newman 插件&#xff0c;必须 先 安装 node.js。 这是前提&#xff01; 安装node.js 可能…

MySQL索引为什么是B+树

MySQL索引为什么是B树 索引是帮助MySQL高效获取数据的数据结构&#xff0c;在数据之外&#xff0c;数据库还维护着满足特定查找算法的数据结构B树&#xff0c;这些数据结果以某种特定的方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;提升数据…

C#实现图像骨架化(ZhangSuen细化算法)

原始图像: 骨架化后图像: 需要安装一个NuGet包:System.Drawing.Common 代码如下: using System.Drawing; using System.Drawing.Imaging;public class Image {public int Width { get; }public int Height { get; }private bool[,] pixels;// 构造函数,初始化图像的宽度…