【Spring(二)】java对象属性的配置(Bean的配置)

news2024/11/23 15:09:39

 有关Spring的所有文章都收录于我的专栏:👉Spring👈

目录
一、前言
二、通过Setter方法配置Bean
三、通过构造器配置Bean
  1. 通过属性名配置
  2. 通过索引配置
  3. 通过属性类型配置
四、通过p命名空间配置bean
五、引用/注入其他bean对象
六、引用/注入内部bean对象
七、引入/注入集合/数组类型
八、使用util名称空间
九、级联赋值


相关文章

【Spring(一)】如何获取对象(Bean)【Spring(一)】如何获取对象(Bean)

一、前言

 上一篇文章中,我们对Spring做了一些基本的了解,以及在Spring中如何获取Bean。我们在XML配置文件中,只是写了那些标签和属性,但它们都各自代表什么、如何配置一个Bean、Bean的配置方式等,这些都是我们接下来需要了解和学习的。

 在配置Bean的时候,我们首先得知道需要配置的那个类是什么。这就和我们用传统方式创建对象一样,通过类来创建一个对象。我们在下边的示例中都使用这个Monster类讲解。

package com.jl.spring.bean;

/**
 * @author long
 * @date 2022/8/30
 */
public class Monster {
    private Integer monsterId;
    private String name;
    private String skill;
    public Monster(){}
    public Monster(Integer monsterId, String name, String skill) {
        this.monsterId = monsterId;
        this.name = name;
        this.skill = skill;
    }

    public Integer getMonsterId() {
        return monsterId;
    }

    public void setMonsterId(Integer monsterId) {
        this.monsterId = monsterId;
    }

    public String getName() {
        return name;
    }

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

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "monsterId=" + monsterId +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

二、通过Setter方法配置Bean

<bean class="com.jl.spring.bean.Monster" id="monster01">
    <property name="monsterId" value="100"/>
    <property name="name" value="牛魔王"/>
    <property name="skill" value="芭蕉扇"/>
</bean>
  1. class是类的全路径,通过类的全路径我们的Spring容器才可以创建Bean对象。
  2. id是Bean的名称,我们可以通过id值来获取到这个Bean对象。
  3. property这个标签用来标识这是一个属性。
  4. name是属性的名称(我们的name值必须要和对象中的属性名一致)。
  5. value是属性的值。

在上边的配置中,我们属性配置用的都是property这个标签,而这个使用这个标签装配属性的前提是:我们的类必须提供相应的setter方法无参构造方法

⚠如果我们不提供属性相应的setter(),那么就会出现下边的错误:
在这里插入图片描述
⚠如果不提供无参构造方法就会出现如下的错误:
在这里插入图片描述

三、通过构造器配置Bean

通过构造器配置器的一个前提就是:提供有参构造。不提供就会报错。
通过构造器来配置Bean,一共有三种配置方式:通过属性名配置、通过索引来配置、通过类型来配置。

1. 通过属性名配置

<bean class="com.jl.spring.bean.Monster" id="monster02">
		<constructor-arg name="monsterId" value="100"/>
		<constructor-arg name="name" value="牛魔王"/>
		<constructor-arg name="skill" value="芭蕉扇"/>
</bean>

这种方式和使用Setter()方式来配置差不多,唯一的区别就是:我们使用有参构造来配置Bean使用的标签是<constructor-arg>

2. 通过索引配置

<bean class="com.jl.spring.bean.Monster" id="monster02">
      <constructor-arg value="200" index="0"/>
      <constructor-arg value="白骨精" index="1"/>
      <constructor-arg value="九阴白骨爪" index="2"/>
</bean>

使用索引配置Bean需要在<constructor-arg>使用index属性,index从0开始,对应我们有参构造函数中参数的顺序。

3. 通过属性类型配置

<bean class="com.jl.spring.bean.Monster"  id="monster02">
    <constructor-arg value="200" type="java.lang.Integer"/>
    <constructor-arg value="白骨精" type="java.lang.String"/>
    <constructor-arg value="九阴白骨爪" type="java.lang.String"/>
</bean>

之所以可以使用类型配置Bean,是因为Java中的重载中规定:不能有完全相同的属性类型。

四、通过p命名空间配置bean

这种方式,同样也要求类必须具备Setter()和无参构造这两个条件。
在使用P命名空间前还需要再XML配置文件的头部添加相关的声明。xmlns:p="http://www.springframework.org/schema/p
在这里插入图片描述

<!--通过p命名空间来配置-->
<bean id="monster03" class="com.jl.spring.bean.Monster"
     p:monsterId="500"
     p:name="红孩儿"
     p:skill="喷火"
/>

我们的这种方式,配置的时候是写在标签内的,而不是在标签体中。

五、引用/注入其他bean对象

我们在上边的学习的过程,属性都是基本数据类型的。但我们的使用过程中,一个对象的属性还有可能是其他我们自定义的对象类型。例如:Service调用Dao的时候,需要在Service层创建一个Dao对象。我们这里就讲解这种情况如何取解决。

当然,开始之前我们也得有两个类,来演示。

package com.jl.spring.dao;

/**
 * @author long
 * @date 2022/8/31
 */
public class MemberDAOImpl {
    public MemberDAOImpl(){
        System.out.println("MemberDAOImpl构造器被调用....");
    }
    public void add(){
        System.out.println("add方法被调用....");
    }
}

package com.jl.spring.service;

import com.jl.spring.dao.MemberDAOImpl;

/**
 * @author long
 * @date 2022/8/31
 */
public class MemberServiceImpl {
    private MemberDAOImpl memberDAO;
    public MemberDAOImpl getMemberDAO(){
        return memberDAO;
    }

    public void setMemberDAO(MemberDAOImpl memberDAO) {
        this.memberDAO = memberDAO;
    }

    public void add(){
        System.out.println("MemberServiceImpl add() 被调用....");
        memberDAO.add();
    }
}

测试类

@Test
public void setBeanByRef(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
    MemberServiceImpl memberService = ioc.getBean("memberService", MemberServiceImpl.class);
    memberService.add();
}
	<!--配置MemberDAOImpl对象-->
<bean class="com.jl.spring.dao.MemberDAOImpl" id="memberDAO"/>
    <!--配置MemberServiceImpl对象-->
<bean class="com.jl.spring.service.MemberServiceImpl" id="memberService">
      <property name="memberDAO" ref="memberDAO"/>
</bean>

property标签中的name和我们前边一样,都是属性的名称。但因为属性值是对象,所以我们这里使用relrel的值是引用的对象,而且这个值是引用的对象的id值。
 这里说明的一点:我们没有要求必须要将引用对象的配置写到前边,因为Spring是在创建好对象之后才进行属性装配的。不知道我这里有没有说清楚,贴一张图吧:
在这里插入图片描述
最后的运行结果:
在这里插入图片描述

六、引用/注入内部bean对象

 这里的内容和【五】一样都是属性为对象的时候的一种处理。但这里使用的是内部注入的方式。

类全部都一样,不同的就是配置方式的区别。

 <!--使用内部bean的方式来配置MemberServiceImpl-->
<bean class="com.jl.spring.service.MemberServiceImpl" id="memberService">
   <property name="memberDAO">
       <bean class="com.jl.spring.dao.MemberDAOImpl"></bean>
   </property>
</bean>

这种内部注入的方式,是在property 标签体内,直接使用bean标签来配置的。因为只是内部使用这个对象,所以可以只写个class全类名就行。

七、引入/注入集合/数组类型

 到这里我们已经可以解决,属性是:基本数据类型、对象。这两种情况,下边我们继续介绍,当我们的属性是集合类型的时候,该如何解决。我们这里通过一个Master来讲解不同的集合类型。

package com.jl.spring.bean;

import java.util.*;

/**
 * @author long
 * @date 2022/8/31
 */
public class Master {
    private String name;
    private List<Monster> monsterList;
    private Map<String,Monster> monsterMap;
    private Set<Monster> monsterSet;
    private String[] monsterName;
    private Properties pros;

    @Override
    public String toString() {
        return "Master{" +
                "name='" + name + '\'' +
                ", monsterList=" + monsterList +
                ", monsterMap=" + monsterMap +
                ", monsterSet=" + monsterSet +
                ", monsterName=" + Arrays.toString(monsterName) +
                ", pros=" + pros +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public List<Monster> getMonsterList() {
        return monsterList;
    }

    public void setMonsterList(List<Monster> monsterList) {
        this.monsterList = monsterList;
    }

    public Map<String, Monster> getMonsterMap() {
        return monsterMap;
    }

    public void setMonsterMap(Map<String, Monster> monsterMap) {
        this.monsterMap = monsterMap;
    }

    public Set<Monster> getMonsterSet() {
        return monsterSet;
    }

    public void setMonsterSet(Set<Monster> monsterSet) {
        this.monsterSet = monsterSet;
    }

    public String[] getMonsterName() {
        return monsterName;
    }

    public void setMonsterName(String[] monsterName) {
        this.monsterName = monsterName;
    }

    public Properties getPros() {
        return pros;
    }

    public void setPros(Properties pros) {
        this.pros = pros;
    }
}
<!--配置Master对象,给集合属性赋值-->
<bean class="com.jl.spring.bean.Master" id="master">
   <property name="name" value="太上老君"/>
   <!--list集合-->
   <property name="monsterList">
       <list>
           <!--引用的方式-->
           <ref bean="monster01"/>
           <ref bean="monster02"/>
           <!--内部bean的方式-->
           <bean class="com.jl.spring.bean.Monster">
               <property name="name" value="葫芦娃"/>
               <property name="skill" value="喷水"/>
               <property name="monsterId" value="111"/>
           </bean>
       </list>
   </property>
   <!--map集合-->
   <property name="monsterMap">
       <map>
           <entry>
               <key>
                   <value>monster02</value>
               </key>
               <ref bean="monster02"></ref>
           </entry>
           <entry>
               <key>
                   <value>monster03</value>
               </key>
               <ref bean="monster03"/>
           </entry>
       </map>
   </property>
   <!--set集合-->
   <property name="monsterSet">
       <set>
           <ref bean="monster01"/>
           <ref bean="monster02"/>
           <bean class="com.jl.spring.bean.Monster">
               <property name="monsterId" value="123"/>
               <property name="name" value="银角大王"/>
               <property name="skill" value="扔葫芦"/>
           </bean>
       </set>
   </property>
   <!--给数组注入-->
   <property name="monsterName">
       <array>
           <value>123</value>
           <value>321</value>
           <value>456</value>
           <value>654</value>
       </array>
   </property>
   <!--配置properties-->
   <property name="pros">
       <props>
           <prop key="key01">one</prop>
           <prop key="key02">two</prop>
           <prop key="key03">three</prop>
       </props>
   </property>
</bean>

这里面的PropertiesHashtable的子类 , 是 key-value 的形式(key和value都是String)。

测试类

@Test
public void setBeanByCollection(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
    Master master = ioc.getBean("master", Master.class);
    System.out.println(master);
}

结果截图
在这里插入图片描述

八、使用util名称空间

和p命名空间一样我们同样需要在XML文件的头部添加声明xmlns:util="http://www.springframework.org/schema/util"
在这里插入图片描述
我们这里同样使用Matser类说明。

 <!--通过util命名空间配置-->
<util:list id="myList">
    <ref bean="monster01"/>
    <ref bean="monster02"/>
    <ref bean="monster03"/>
</util:list>
<bean id="monster07" class="com.jl.spring.bean.Master">
    <property name="monsterList" ref="myList"/>
</bean>

测试代码

@Test
public void  setBeanByUtil(){
     ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
     Master master = ioc.getBean("monster07", Master.class);
     System.out.println(master);
 }

运行截图
在这里插入图片描述
因为我们这里只注入了monsterList属性,所以其他的属性都为null。

当然util除了可以注入List,还可以注入其他的集合属性。在这里插入图片描述

九、级联赋值

级联赋值,从他这个名字就可以看出:它是属性的多级关联赋值。不懂也没有关系,我们下边会举例说明。

首先我们的准备两个类:DeptEmp

package com.jl.spring.bean;

/**
 * @author Long
 * @date 2022/11/19
 * @CSDN https://blog.csdn.net/qq_35947021
 **/
public class Emp {
    private String name;
    private Dept dept;

    public Emp() {
    }

    public Emp(String name, Dept dept) {
        this.name = name;
        this.dept = dept;
    }

    public String getName() {
        return name;
    }

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

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name='" + name + '\'' +
                ", dept=" + dept +
                '}';
    }
}
package com.jl.spring.bean;

/**
 * @author Long
 * @date 2022/11/19
 * @CSDN https://blog.csdn.net/qq_35947021
 **/
public class Dept {
    private String name;
    public Dept() {
    }
    public Dept(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Dept{" +
                "name='" + name + '\'' +
                '}';
    }
}
<bean id="emp" class="com.jl.spring.bean.Emp">
    <property name="name" value="jack"/>
    <property name="dept" ref="dept"/>
    <property name="dept.name" value="Java 开发部"/>
</bean>
<bean id="dept" class="com.jl.spring.beans.Dept"/>

我们可以通过在引用对象之后给引用的对象的属性进行赋值。这样方式就叫级联赋值

测试类

 @Test
public void  setBeanByCascadingValues(){
   ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
   Emp emp = ioc.getBean("emp", Emp.class);
   System.out.println(emp);
}

结果截图
在这里插入图片描述

 以上就是有关Spring中配置属性的内容,下一节我们继续讲解剩下的内容。如果文章中有描述不准确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏
最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏

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

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

相关文章

openEuler快速入门-openEuler系统安装openGauss数据库安装

文章目录前言一、安装openEuler系统安装二、运行虚拟机&#xff0c;配置三、安装openGauss数据库总结前言 openEuler&#xff1a;openEuler 是一款开源操作系统。当前 openEuler 内核源于 Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&a…

[附源码]java毕业设计网络身份认证技术及方法

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

_001_Zotero入门

Zetoro大纲一、安装Zotero二、收集题录2.1 浏览器插件2.2 通过标识符添加2.3 拖拽文献2.4 从剪切板导入2.5 批量导入2.6 手动添加&#xff08;不建议使用&#xff09;2.7 方法总结三、管理题录3.1 移动分类3.2 查重3.3 关联3.4 标签3.5 笔记3.6 RSS订阅3.7 快捷键3.8 总结四、在…

Verilog 时序逻辑 UDP

时序逻辑 UDP 与组合逻辑 UDP 在定义形式和行为功能上均有不同&#xff0c;主要区别如下&#xff1a; 1、时序逻辑 UDP 的输出端必须声明为 reg 型。2、时序逻辑 UDP 可以用 initial 语句初始化。3、状态表格式也稍有不同&#xff1a; ... : <current_state> : &l…

RabbitMQ初步到精通-第七章-RabbitMQ之延迟队列

目录 第七章-RabbitMQ之延迟队列 1. 延迟队列概念 2. 应用场景 3. 架构模式 3.1 队列TTL实现 3.2 消息TTL实现 3.3 插件实现 4. 代码验证 5. 总结 第七章-RabbitMQ之延迟队列 1. 延迟队列概念 延迟-意即 非实时&#xff0c;之前我们讨论大部分的案例都是生产者将消息发…

【毕业设计】61-基于单片机的超声波测距仪设计(原理图、仿真工程、低重复率参考设计文档、PPT、开题报告、任务书)

【毕业设计】61-基于单片机的超声波测距仪设计&#xff08;原理图、仿真工程、低重复率参考设计文档、PPT、开题报告、任务书&#xff09;[toc] 资料下载链接 资料下载链接 资料链接&#xff1a;https://www.cirmall.com/circuit/33762/ 包含此题目毕业设计全套资料&#xff…

UDS应用场景

诊断协议那些事儿 本文为诊断协议那些事儿专栏文章&#xff0c;旨在介绍诊断的应用场景&#xff0c;其本质就是一个用于汽车行业通信的需求规范&#xff0c;用于诊断功能数据的解析&#xff01;让读者对诊断有一个深入的认识。 关联文章&#xff1a;UDS协议发展历史 文章目录…

idea如何设置代理实现管理突破呢

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

抗锯齿渲染

&#xff08;逻辑绘图&#xff09;图像在坐标图中的显示&#xff1a; 笔的默认宽度为1&#xff0c;当笔的宽度大于1时&#xff0c;相当于在则条线的两边均匀加厚&#xff0c;确定坐标的还是这条宽度为1的线段&#xff0c;相当于宽度的中心位置。 物理绘图 &#xff08;默认情况…

集成学习、装袋法、提升法、GBDT、随机森林(机器学习)

集成学习 集成学习(Ensemble learning)是机器学习中近年来的一大热门领域。其中的 集成方法是用多种学习方法的组合来获取比原方法更优的结果 使用于组合的算法是弱学习算法 即分类正确率仅比随机猜测略高的学习算法 但是组合之后的效果仍可能高于强学习算法 即集成之后的…

总抱怨Mac运行速度又卡又慢?这些方法你用得上

通常大家处理Mac运行速度慢的方法不是重启就是清空废纸篓&#xff0c;但是这两种方法对于Mac提速性能的效果是微之甚微的&#xff0c;想要彻底解决Mac运行速度慢&#xff0c;你应该试试一下三种方法~ 1、清理磁盘空间 硬盘空间过少是Mac运行变慢很大的一个因素&#xff0c;各种…

第03章_基本的SELECT语句

第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有…

【用户画像】Redis的常用五大数据类型和配置文件介绍

文章目录一 常用五大数据类型简介1 Redis键(key)2 Redis字符串(String)3 Redis列表(List)4 Redis集合(Set)5 Redis哈希(Hash)6 Redis有序集合Zset(sorted set)二 Redis配置文件介绍1 UNITS2 INCLUDES3 NETWORK4 MEMORY MANAGEMENT一 常用五大数据类型简介 常用命令 1 Redis键…

攻防世界碎纸机11

碎纸机11 题目描述&#xff1a;我们从碎纸机里抢救回来了某个关键图片资料&#xff0c;你能帮我们修复它吗&#xff1f; 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87094757 打开文件&#xff0c;发现是让我们拼图。 可以用python脚本进行拼接。 脚…

pytorch初学笔记(七):神经网络基本骨架 torch.nn.Module

目录 一、 torch.nn模块 二、module模块 三、自定义搭建神经网络 一、 torch.nn模块 torch.nn — PyTorch 1.13 documentation 二、module模块 Module — PyTorch 1.13 documentation 我们自己定义的神经网络需要继承nn.Module类&#xff0c;需要重写以下两个方法&#xf…

智慧林业解决方案-最新全套文件

智慧林业解决方案-最新全套文件一、建设背景二、建设架构1、火险预警2、AI林火分析3、应急指挥4、森林资源GIS5、林业巡检6、林业OA三、建设方案四、获取 - 智慧林业全套最新解决方案合集一、建设背景 森林资源是林地及其所生长的森林有机体的总称&#xff0c;以林木资源为主&…

设计模式之设计原则

程序设计的要遵循的一些理论,也可以理解为程序设计的一种要求和目标,是面向对象程序设计的基石,也是面向对象程序设计的质量保障和依据。设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为…

Python基础语法入门

14天学习训练营导师课程&#xff1a; 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 上一节课&#xff0c;我们了解了基础环境如何配置&#xff0c…

【深度学习】图像分类数据集Fashion-MNIST

今天在手撸深度学习代码的时候&#xff0c;遇到了这个数据集&#xff0c;但是调用的函数的参数和功能不是很明白&#xff0c;因此选择写篇博客总结一下。 一、介绍 Fashion-MNIST是⼀个10类服饰分类数据集。 torchvision 包&#xff1a;它是服务于 PyTorch 深度学习框架的&a…

springboot+maven大学校友活动风采展示管理信息系统

大学校友管理信息系统当然也不能排除在外&#xff0c;从校友活动、校友风采的统计和分析&#xff0c;在过程中会产生大量的、各种各样的数据。本文以大学校友管理信息系统为目标&#xff0c;采用B/S模式&#xff0c;以SSM为开发框架&#xff0c;Jsp为开发技术、Eclipse/idea为开…