Spring——Bean管理-xml方式进行属性注入

news2024/12/26 8:51:39

目录

一、xml方式创建对象

二、xml方式注入属性

第①种方式注入:set方法注入

第②种方式注入:有参构造函数注入

constructor-arg:通过构造函数注入

用name标签属性: 不按照顺序也会自动匹配

使用index标签属性:index的值为参数的顺序,默认从0开始

使用type标签属性:要和参数数据类型严格一致

三、xml注入其他类型属性

1、字面量--null值

2、含有特殊符号

3、注入属性-外部bean

4、注入属性-内部bean

什么是内部bean?

什么时候使用内部bean?

如何使用内部bean?

5、注入集合属性——数组、List集合、Map集合、Set集合

抽取公共部分

 Spring系列文章


一、xml方式创建对象

<!--    配置User对象创建-->
<!--    id是取得别名,通过id别名可以把类找到-->
<bean id="user" class="com.atguigu.spring5.User"></bean>
  • id:唯一标识,不能加特殊符号
  • class:类全路经(包类路径)
  • name:可以加特殊符号

二、xml方式注入属性

DI:依赖注入,就是注入属性

第①种方式注入:set方法注入

package com.atguigu.spring5.Book;

public class Book {
    private String bname;
    private String bauthor;
    public void setBname(String bname){
        this.bname=bname;
    }

    public void setBauthor(String bauthor){
        this.bauthor=bauthor;
    }

    public static void main(String[] args) {
        Book book = new Book();
        book.setBname("abc");
    }

    public void testDemo(){
        System.out.println(bname+"---"+bauthor);
    }
}
<?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">

<!--    2.set方法注入属性-->
    <bean id="book" class="com.atguigu.spring5.Book.Book">
<!--        使用propterty完成属性注入-->
<!--        name:类里面属性名称-->
<!--        value:向属性注入的值-->
        <property name="bname" value="追风筝的人"></property>
        <property name="bauthor" value="卡勒德·胡赛尼"></property>
    </bean>
</beans>
package com.atguigu.spring5.Book;

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

public class BoolTestMain {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Booktest.xml");
        Book book = context.getBean("book", Book.class);
        System.out.println(book);
        book.testDemo();
    }
}

我们还可以通过另一种方式简化写法—p名称空间注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="books" class="com.atguigu.spring5.Book.Book" p:bname="朝花夕拾" p:bauthor="鲁迅"></bean>

</beans>

第②种方式注入:有参构造函数注入

public class Orders {
    //    有参数构造注入属性
    private String oname;
    private String address;
    private double money;

    public Orders(String oname, String address, double money) {
        this.oname = oname;
        this.address = address;
        this.money = money;
    }

    public void show() {
        System.out.println(oname + "---" + address + "---" + money);
    }
}

constructor-arg:通过构造函数注入

使用value标签属性: 默认按照constructor-arg标签的顺序

<constructor-arg value="电脑"></constructor-arg>
<constructor-arg value="China"></constructor-arg>

用name标签属性: 不按照顺序也会自动匹配

<constructor-arg name="oname" value="电脑"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>

使用index标签属性:index的值为参数的顺序,默认从0开始

 <!--index="0":有参构造的第一个属性-->
<constructor-arg index="0" value="电脑"></constructor-arg>
<constructor-arg index="1" value="China"></constructor-arg>

使用type标签属性:要和参数数据类型严格一致

(如果数据类型一致,按照constructor-arg标签的顺序匹配)

<constructor-arg type="double" value="23"></constructor-arg>
<constructor-arg type="java.lang.String" value="电脑"></constructor-arg>
<constructor-arg type="java.lang.String" value="China"></constructor-arg>

三、xml注入其他类型属性

1、字面量--null值

<constructor-arg name="oname" value="朝花夕拾"/>
<constructor-arg name="oauthor" value="鲁迅"/>
<constructor-arg name="address" >
            <null></null>
</constructor-arg>

2、含有特殊符号

  • &lt;&gt;
  • 把带特殊符号内容写到!CDATA
  <!--        1、使用&lt;&gt;先进行转义-->
<property name="bauthor" value="鲁迅"></property>
<property name="bname" value="&lt;&gt;朝花夕拾>>"></property>

<!--        2、使用!CDATA-->
<property name="bauthor">
		<value><![CDATA[<<南京>>]]></value>
</property>

3、注入属性-外部bean

通过ref属性将进行注入

public class School {
    //创建School类型属性,生成set方法
    private Teacher teacher;

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
}
<!--    注入外部bean-->
<bean id="school" class="com.atguigu.spring5.propertyTest.School">
        <property name="teacher" ref="teachers"></property>
</bean>

<bean id="teachers" class="com.atguigu.spring5.propertyTest.Teacher"></bean>

4、注入属性-内部bean

什么是内部bean?

在某一个bean中定义另一个bean作为属性

什么时候使用内部bean?

如果School类中的某个属性的数据类型是另一个类Book,则可以把这个类Book定义在属性的内部

如何使用内部bean?

public class School {
    //创建School类型属性,生成set方法
    private Teacher teacher;

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    //部门
    private Book dept;
    public void setDept(Book dept) {
        this.dept = dept;
    }
}
public class Book {
    private String bname;
    private String bauthor;

    public void setBname(String bname) {
        this.bname = bname;
    }
}
 <!--    注入内部bean-->
<bean id="school" class="com.atguigu.spring5.propertyTest.School">
        <property name="teacher" ref="teachers"></property>
        <property name="dept" >
            <bean id="book" class="com.atguigu.spring5.Book.Book">
                <property name="bname" value="朝花夕拾"></property>
            </bean>
        </property>
</bean>

5、注入集合属性——数组、List集合、Map集合、Set集合

package com.atguigu.spring5.CollectionTypeTest;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @BelongsProject: 02-Spring
 * @BelongsPackage: com.atguigu.spring5.CollectionTypeTest
 * @Author: dengLiMei
 * @CreateTime: 2023-02-09  09:46
 * @Description: TODO
 * @Version: 1.0
 */
public class Student {
    //数组
    private String[] courses;

    //    List集合
    private List<String> lists;

    //Map集合
    private Map<String, String> maps;

    //Set集合
    private Set<String> sets;

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }

    public Student() {
    }

    public void setCourses(String[] courses) {
        this.courses = courses;
    }

    public void setLists(List<String> lists) {
        this.lists = lists;
    }

    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }

    public void show() {
        System.out.println(Arrays.toString(courses));
        System.out.println((lists));
        System.out.println((maps));
        System.out.println((sets));
    }
}
<?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">

    <bean id="students" class="com.atguigu.spring5.CollectionTypeTest.Student">
        <!-- 数组-->
        <property name="courses">
            <array>
                <value>spring5</value>
                <value>springboot</value>
            </array>
        </property>

        <!--        List类型-->
        <property name="lists">
            <list>
                <value>springcloud</value>
                <value>springcloudAlibaba</value>
            </list>
        </property>

        <!--        Map集合-->
        <property name="maps">
            <map>
                <entry key="QQ" value="腾讯"></entry>
                <entry key="淘宝" value="阿里"></entry>
            </map>
        </property>

        <!--        Set集合-->
        <property name="sets">
            <set>
                <value>set-spring5</value>
                <value>set-springboot</value>
            </set>
        </property>
    </bean>
</beans>

输出结果:

如果一个类中包含了另一个类的实体对象,可以这样写

public class Course {
    //    课程名称
    private String cname;

    public void setCname(String cname) {
        this.cname = cname;
    }
}
package com.atguigu.spring5.CollectionTypeTest;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Student2 {
    //实体对象-学生有多门课程
    private List<Course> courseList;

    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "courseList=" + courseList +
                '}';
    }
}
<bean id="student2" class="com.atguigu.spring5.CollectionTypeTest.Student2">
        <property name="courseList">
            <list>
                <ref bean="course1"></ref>
                <ref bean="course2"></ref>
            </list>
        </property>
    </bean>

<!--    创建多个course对象-->
<bean id="course1" class="com.atguigu.spring5.CollectionTypeTest.Course">
        <property name="cname" value="spring5框架"></property>
</bean>
<bean id="course2" class="com.atguigu.spring5.CollectionTypeTest.Course">
        <property name="cname" value="MyBatis框架"></property>
</bean>
public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("CollectionTypeBeans.xml");
        Student2 students1 = context.getBean("student2", Student2.class);
        students1.show();
}

输出结果:

目前的问题:只能当前类使用,其他类不能用,接下来就是把集合属性抽取成公共部分让所有实体类都能够引入

抽取公共部分

public class Book {
    private List<String> list;

    public void setList(List<String> list) {
        this.list = list;
    }

    public void show(){
        System.out.println(list);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!--    1、提取list集合类型属性注入-->
    <util:list id="bookList">
        <value>spring5</value>
        <value>springboot</value>
        <value>springcloud</value>
    </util:list>

    <!--    2、提取list集合类型属性注入使用-->
    <bean id="book" class="com.atguigu.spring5.CollectionTypeTest.Book">
        <property name="list" ref="bookList"></property>
    </bean>
</beans>
public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("CollectionTypeBeans.xml");
        Book book = context.getBean("book", Book.class);
        book.show();
}

输出结果:


 Spring系列文章:

Spring——是什么?作用?内容?用到的设计模式?

Spring——Bean管理-xml方式进行属性注入

Spring——Bean管理-注解方式进行属性注入

Spring——什么是IOC?

Spring——AOP是什么?如何使用?

Spring——什么是事务?传播行为?事务隔离级别有哪些?

Spring——整合junit4、junit5使用方法

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏脚印支持一下博主~

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

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

相关文章

使用Struts的论坛系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网的高速发展&#xff0c;目前可通过论坛系统可随时取得国际最新的软件及信息&#xff0c;也可以通过论坛系统来和别人讨论计算机软件、硬件、多媒体、程序设计、以及影视等等各种有趣的话题。本系统按照小型公司的实际要求…

第三讲:ambari编译后的安装包制作流程说明

一、概述 前两讲,我们已经将 Ambari 源码编译成功。现在我们想将 Ambari 编译后的 rpm 包,都放到 yum 本地仓库中,这样 Ambari 与 HDP 在安装部署时,就直接使用的我们自己编译的安装包了。 Ambari 的 rpm 包,有这么几类: ambari-server rpmambari-agent rpmambari metr…

React.memo 解决函数组件重复渲染

为什么会存在重复渲染? react 在 v16.8 版本引入了全新的 api&#xff0c;叫做 React Hooks&#xff0c;它的使用与以往基于 class component 的组件用法非常的不一样&#xff0c;不再是基于类&#xff0c;而是基于函数进行页面的渲染&#xff0c;我们把它又称为 functional c…

id函数 / 可变类型变量 / 不可变类型变量 / +=操作

前言 再说正文之前&#xff0c;需要大家先了解一下对象&#xff0c;指针和引用的含义&#xff0c;不懂得同学可以参考我上一篇博客“(12条消息) 引用是否有地址的讨论的_xx_xjm的博客-CSDN博客” 正文 一&#xff1a;python中一切皆对象 “python中一切皆对象”这句话我相信…

【LeetCode】剑指 Offer(15)

目录 题目&#xff1a;剑指 Offer 32 - II. 从上到下打印二叉树 II - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 32 - III. 从上到下打…

分子模拟—Ovito渲染案例教程

♡\heartsuit♡♠\spadesuit♠《分子模拟—Ovito渲染案例教程》♡\heartsuit♡♠\spadesuit♠&#xff1a; 说明&#xff1a; 本博文主要介绍专栏 《分子模拟—Ovito渲染案例教程》\rm 《分子模拟—Ovito渲染案例教程》《分子模拟—Ovito渲染案例教程》, 依托于实际的物理问题…

高数:数列的收敛

数列特点无限个数特定顺序数列和集合区别集合可以乱序&#xff0c;数列不行集合出现重复元素依然相同&#xff0c;数列出现新的重复元素就不相等[1&#xff0c;2&#xff0c;3&#xff0c;4][1&#xff0c;2&#xff0c;3&#xff0c;3&#xff0c;4]对集合来说相等&#xff0c…

【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上)

系列文章目录 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上) 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(中) 文章目录系列文章目录前言一、数据库配置信息二、下载OGG1…

LQB手打代码,DS1302基础代码01

一&#xff0e;描述 DS1302时钟芯片是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能。DS1302芯片包含一个用于存储实时时钟/日历的 31 字节的静态 RAM&#xff0c;可通过…

docker 运行花生壳实现内外网穿透

环境&#xff1a;centos 7 ,64位 1、创建一个指定的文件夹作为安装示例所用&#xff0c;该示例文件夹为“hsk-nwct”。“hsk-nwct”内创建“app”文件夹作为docker容器挂载出来的文件。 2、在“app”内下载花生壳linux安装包&#xff0c;下载花生壳应用&#xff1a;花生壳客户…

最新版本vue3+vite重构尚品汇(解决接口问题)第21-50集

第21集&#xff0c;第22集&#xff1a;照敲就行&#xff0c;引入概念。 第23集&#xff1a;防抖概念&#xff1a;前面所有的触发被取消&#xff0c;最后一次执行在规定的时间之后才会触发&#xff0c;只会执行一次。Lodash插件里面封装了函数的防抖和节流的业务。用到lodash确实…

SpringAOP——基础知识

AOP AOP全称是Aspect Oriented Programming 即面向切面编程&#xff0c;是对一类统一事务的集中处理 例如&#xff0c;我们的网页许多地方都需要进行登陆验证&#xff0c;这时就需要在很多地方添加重复的验证代码&#xff0c;而AOP可以集中配置需要登陆验证的地方&#xff0c;…

简单认识: 数据库 zhi 操作(MySQL为例)

目录 前言 一&#xff0c;库 二&#xff0c;站在巨人的肩膀上理解 库 的操作 下节预告&#xff1a; 前言 今天是库库森日记第n……篇之数据库篇一 库 库 库~~~~的~操~作。 如果看完这篇文章&#xff0c;你觉得数据库从简单的创建库&#xff0c;表&#xff0c;修改…

世界那么大,你哪都别去了,来我带你了解CSS3 (一)

文章目录‍❤️‍&#x1f525;CSS简介‍‍‍‍❤️‍&#x1f525;CSS选择器❣️选择器一❣️选择器二❣️关系选择器‍❤️‍&#x1f525;CSS属性❣️字体属性❣️背景属性❣️文本属性❣️表格属性‍❤️‍&#x1f525;CSS简介 CSS概念 CSS&#xff08;Cascading Style Sh…

JWT续期问题,ChatGPT解决方案

JWT&#xff08;JSON Web Token&#xff09;通常是在用户登录后签发的&#xff0c;用于验证用户身份和授权。JWT 的有效期限&#xff08;或称“过期时间”&#xff09;通常是一段时间&#xff08;例如1小时&#xff09;&#xff0c;过期后用户需要重新登录以获取新的JWT。然而&…

数据结构基础之链表

目录 前言 1、什么是链表 2、添加元素 3、虚拟头结点 4、查询&修改元素 5、删除元素 附&#xff1a;完整代码 前言 又到周末了&#xff0c;修整了一天&#xff0c;继续来写点东西吧&#xff0c;今天&#xff0c;我们来学习数据结构中的另一种基础的数据结构——链表…

jsp进阶

文章目录jsp进阶内容回顾JSP 的九大内置对象内置对象的创建九大内置对象详解四大作用域对象四大作用域范围总结EL 进阶JSTL 标准标签库JSTL 核心标签jsp进阶 内容回顾 jsp 创建 jsp 的工作原理&#xff1a;翻译 --> 编译 --> 运行 翻译&#xff1a;第一次访问 jsp 页面…

Redis简单笔记

1 为什么需要Redis 数据分冷热&#xff0c;将热数据存储到内存中 2 Redis应用案例 2.1 连续签到 2.1.1 String数据结构 可以存储字符串、数字、二进制数据通常和expire配合使用场景:存储计数、Session2.2 消息通知 用list作为消息队列 使用场景:消息通知。 例如当文章更新时…

机器学习模型的可解释性算法汇总!

模型可解释性汇总简 介目前很多机器学习模型可以做出非常好的预测&#xff0c;但是它们并不能很好地解释他们是如何进行预测的&#xff0c;很多数据科学家都很难知晓为什么该算法会得到这样的预测结果。这是非常致命的&#xff0c;因为如果我们无法知道某个算法是如何进行预测&…

巴别塔——问答平台调研

项目内容这个作业属于哪个课程2023 年北航软件工程这个作业的要求在哪里个人作业-软件案例分析我在这个课程的目标是了解软件工程的方法论、获得软件项目开发的实践经验、构建一个具有我的气息的艺术品这个作业在哪个具体方面帮助我实现目标对于“程序员是什么”这个问题有了一…