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

news2024/12/27 17:42:53

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,提高代码的可维护性和可读性。

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

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

相关文章

BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出)

Matlab实现BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测&#xff08;多输入单输出&#xff09; 目录 Matlab实现BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测&#xff08;多输入单输出&#xff09;分类效果基本描述…

python: Oracle Stored Procedure query table

oracel sql script CREATE OR REPLACE PROCEDURE SelectSchool(paramSchoolId IN char,p_cursor OUT SYS_REFCURSOR ) AS BEGINOPEN p_cursor FORSELECT *FROM SchoolWHERE SchoolId paramSchoolId; END SelectSchool; /-- 查询所有 CREATE OR REPLACE PROCEDURE SelectScho…

软件老化分析

软件老化 课程&#xff1a;软件质量分析 作业 解答 Python代码如下&#xff1a; n int(input("类别数&#xff1a;")) theta list(map(float, input("各个类别的权重&#xff1a;").split())) m list(map(int, input("各个类别的度量元数量&…

cesium通过经纬度获取3dtiles 得feature信息

找到这里3dtiles的两种访问方式&#xff1a; 1.1 3DTileContent#getFeature 这里涉及3DTile 数据结构&#xff0c;暂不了解3DTile 数据结构&#xff0c;因此暂不使用。 1.2 scene.pick 本次使用 scene表示虚拟场景中所有 3D 图形对象和状态的容器&#xff1b;scene中…

【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】

系列文章目录 文章目录 前言一、概述1.1 Lua堆栈 二、栈操作2.1 基本的栈操作2.2 入栈操作函数2.3 出栈操作函数2.4 既入栈又出栈的操作函数2.5 栈检查与类型转换函数2.5 获取表数据 三、实例演示总结 前言 Lua是一种轻量级的、高性能的脚本语言&#xff0c;经常被用于游戏开发…

Linux -- 生产消费模型

目录 概念 代码 BlockQueue.hpp 代码&#xff1a; 伪唤醒&#xff01;&#xff01; Thread.hpp 代码&#xff1a; Task.hpp 代码&#xff1a; test.cc 代码&#xff1a; 再次理解 概念 生产消费模型&#xff0c;也称为生产者-消费者问题&#xff0c;是计算机科学中的一…

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)

DevOps实战&#xff1a;用Kubernetes和Argo打造自动化CI/CD流程&#xff08;1&#xff09; 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点&#xff0c;并基于Argo搭建一套完整的DevOps CI/CD服务平台&#xff0c;包括Argo CD…

React 第二十节 useRef 用途使用技巧注意事项详解

简述 useRef 用于操作不需要在视图上渲染的属性数据&#xff0c;用于访问真实的DOM节点&#xff0c;或者React组件的实例对象&#xff0c;允许直接操作DOM元素或者是组件&#xff1b; 写法 const inpRef useRef(params)参数&#xff1a; useRef(params)&#xff0c;接收的 …

【2024最新】基于Python+Mysql+django的水果销售系统Lw+PPT

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

利用Java爬虫速卖通按关键字搜索AliExpress商品

在这个信息爆炸的时代&#xff0c;数据的价值日益凸显。对于电商领域的从业者来说&#xff0c;能够快速获取商品信息成为了一项重要的技能。速卖通&#xff08;AliExpress&#xff09;作为全球领先的跨境电商平台&#xff0c;拥有海量的商品数据。本文将介绍如何使用Java语言编…

动态规划<五> 子数组问题(含对应LeetcodeOJ题)

目录 引例 经典LeetcodeOJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门 Leetcode<53> 最大子数组和 画图分析: 使用动态规划解决 1.状态表示 dp[i]表示以i位置为结尾的所有子数组中的最大和 2.状态转移方程 子数组的问题可以…

前端实现PDF预览的几种选择(pdfjs-dist、react-pdf、pdf-viewer)

记录 PDF预览的选型 对于浏览器自带的PDF预览 如果能直接使用&#xff0c;那自然最好不过了&#xff0c;但考虑多种因素&#xff0c;比如权限问题&#xff0c;禁止用户去下载PDF、预览样式不统一&#xff08;不同浏览器PDF预览的实现不同&#xff09;&#xff0c;所有最终放弃…

小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面

文章目录 前言一、开启SSH二、配置阿里云ddns1.准备工作2.创建ddns脚本3.添加定时任务 三、开启外网访问SSH和WEB管理界面1、解除WEB管理页面访问限制2.手动添加防火墙端口转发规则&#xff0c;开启外网访问WEB管理和SSH 前言 例如&#xff1a;随着人工智能的不断发展&#xf…

机器学习(三)-多项式线性回归

文章目录 1. 多项式回归理论2. python通过多项式线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 构建二次多项式特征&#xff08;1, x, x^2&#xff09;2.6 导入线性回归模块2.7 对测试集进行预测2.8 计算均方误差 J2.9 计算参数 w0、w1、w22.10 可视…

【再学javascript算法之美】前端面试频率比较高的基础算法题

基础算法题练习代码&#xff0c;看看能做出几道题 代码实现 找出字符串中出现次数最多的字符 const array "cncnansdnajsadnjasndjnasjdnjj";// 找出出现次数最多的字符 let obj {}; for (let index 0; index < array.length; index) {const element array[…

芯产品|暴雨推出基于兆芯晶片的新品台式机

近期&#xff0c;基于兆芯开先KX-7000系列处理器&#xff0c;暴雨推出新品桌面整机TSJ200-ZX&#xff0c;凭借开先KX-7000系列处理器强劲的性能表现和优异的兼容性&#xff0c;将为行业信创深入发展增添更多的活力和能量。 暴雨TSJ200-ZX是针对政务办公&#xff0c;金融机构和…

echarts进度仪表盘形式

const pointerData 55; // 仪表指针数据const steps 10; // 总共10个步骤 const borderColor {colorStops: [{offset: 0,color: rgba(208, 244, 255, 1)}, {offset: 1,color: rgba(35, 190, 240, 1)}] }; // 边框颜色// 使用数组和循环动态生成颜色数组 const axisLinecolor…

代码随想录-笔记-其八

让我们开始&#xff1a;动态规划&#xff01; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; class Solution { public:int climbStairs(i…

线性回归a

训练数据 求平方损失的平均值1/n&#xff0c;目标求解w&#xff0c;b使得损失函数最小 显示解

学习记录—正则表达式-基本语法

正则表达式简介-《菜鸟教程》 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#xff0c;用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 本期内容将介绍普通字符&#xff0c;特殊…