基于XML配置bean(一)

news2024/12/23 19:47:11

文章目录

    • 1.获取bean的两种方式
        • 1.通过id获取bean(前面用过)
        • 2.通过类型获取bean(单例时使用)
          • 1.案例
          • 2.代码
            • 1.beans.xml
            • 2.SpringBeanTest.java
            • 3.结果
          • 3.注意事项
    • 2.三种基本依赖注入方式
        • 1.通过属性配置bean(前面用过)
        • 2.通过构造器配置bean
          • 1.通过index配置
          • 2.通过name配置
          • 3.通过type配置
          • 4.验证
        • 3.通过p命名空间配置bean
          • 1.配置
          • 2.注意需要alt + enter引入命名空间定义
    • 3.属性注入bean对象的两种方式
        • 1.通过ref注入
          • 1.dao/MemberDao.java
          • 2.MemberDaoImpl.java
          • 3.service/MemberServiceImpl.java
          • 4.beans.xml
          • 5.测试SpringBeanTest
          • 6..解释
        • 2.通过内部bean注入
          • beans.xml
    • 4.不同类型的属性注入方式
        • 1.List
          • 1.Master.java
          • 2.beans.xml
          • 3.测试
        • 2.Map
          • 1.beans.xml
          • 2.测试
        • 3.Set
          • 1.beans.xml
          • 2.测试
        • 4.Array
          • 1.beans.xml
          • 2.测试
        • 5.Properties
          • 1.beans.xml
          • 2.测试
        • 6.util:list
          • 1.BookStore.java
          • 2.beans.xml
          • 3.测试
        • 7.级联属性赋值
          • 1.Dept.java
          • 2.Emp.java
          • 3.beans.xml
          • 4.测试

1.获取bean的两种方式

1.通过id获取bean(前面用过)
2.通过类型获取bean(单例时使用)
1.案例

image-20240216170105886

2.代码
1.beans.xml
    <bean class="com.sxs.spring.bean.Car">
        <property name="name" value="奔驰"/>
        <property name="id" value="100"/>
        <property name="price" value="10.2"/>
    </bean>
2.SpringBeanTest.java
    //通过类型来获取bean对象
    @Test
    public void getBeanByType() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Car car = ioc.getBean(Car.class);
        System.out.println(car);
    }
3.结果

image-20240216170458002

3.注意事项

image-20240216170600891

2.三种基本依赖注入方式

1.通过属性配置bean(前面用过)
2.通过构造器配置bean
1.通过index配置
    <!--通过索引配置-->
    <bean class="com.sxs.spring.bean.Car" id="car1">
        <constructor-arg index="0" value="100"></constructor-arg>
        <constructor-arg index="1" value="奔驰1"></constructor-arg>
        <constructor-arg index="2" value="300.12"></constructor-arg>
    </bean>
2.通过name配置
    <!--通过名字配置-->
    <bean class="com.sxs.spring.bean.Car" id="car2">
        <constructor-arg name="id" value="200"></constructor-arg>
        <constructor-arg name="name" value="宾利"></constructor-arg>
        <constructor-arg name="price" value="2000000"></constructor-arg>
    </bean>
3.通过type配置
    <!--通过类型配置-->
    <bean class="com.sxs.spring.bean.Car" id="car3">
        <constructor-arg type="java.lang.Integer" value="300"></constructor-arg>
        <constructor-arg type="java.lang.String" value="宝马"></constructor-arg>
        <constructor-arg type="java.lang.Double" value="2332233223"></constructor-arg>
    </bean>
4.验证
    //得到三种方式配置的bean对象
    @Test
    public void Construct() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Object car1 = ioc.getBean("car1");
        Object car2 = ioc.getBean("car2");
        Object car3 = ioc.getBean("car3");
        System.out.println(car1);
        System.out.println(car2);
        System.out.println(car3);
    }

image-20240216181901460

3.通过p命名空间配置bean
1.配置
    <!--通过p命名空间来配置bean-->
    <bean class="com.sxs.spring.bean.Car" id="car4"
        p:id = "100"
        p:name = "路虎"
        p:price = "121212"
    />
2.注意需要alt + enter引入命名空间定义

image-20240216182933116

3.属性注入bean对象的两种方式

1.通过ref注入

image-20240216183305643

1.dao/MemberDao.java
package com.sxs.spring.dao;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface MemberDao {
    public void add();
}

2.MemberDaoImpl.java
package com.sxs.spring.dao;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberDaoImpl implements MemberDao{
    //注意这里有默认的构造方法被调用,因为要反射创建bean对象
    @Override
    public void add() {
        System.out.println("MemberDaoImpl的add方法被调用!");
    }
}

3.service/MemberServiceImpl.java
package com.sxs.spring.service;

import com.sxs.spring.dao.MemberDao;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberServiceImpl {
    //这个service需要使用dao
    MemberDao memberDao;
    public void add() {
        //调用dao的add方法
        memberDao.add();
    }

    //属性注入,需要getter和setter方法

    public MemberDao getMemberDao() {
        return memberDao;
    }

    public void setMemberDao(MemberDao memberDao) {
        this.memberDao = memberDao;
    }
}

4.beans.xml
    <!--反射创建MemberDaoMemberDaoImpl的实现类的对象-->
    <bean class="com.sxs.spring.dao.MemberDaoImpl" id="memberDao"/>

    <!--依赖注入到service中-->
    <bean class="com.sxs.spring.service.MemberServiceImpl" id="memberService">
        <!--这里使用属性注入MemberDaoMemberDaoImpl的对象-->
        <property name="memberDao" ref="memberDao"></property>
    </bean>
5.测试SpringBeanTest
    //通过ref来配置bean
    @Test
    public void refBean() {
        //得到经过依赖注入的MemberServiceImpl类的bean对象,注意千万不要自己创建,因为自己new的对象的属性并没有被注入
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        //由于只有一个实例,所以可以使用class类型来获取bean对象
        MemberServiceImpl bean = ioc.getBean(MemberServiceImpl.class);
        bean.add();
    }

image-20240216190843457

6…解释
  1. 这里MemberDaoImpl有一个add方法,MemberServiceImpl需要调用这个方法,所以需要这个MemberDao类型的属性
  2. 通过spring反射创建MemberDaoImpl的实例(使用默认构造方法)
  3. 再通过spring反射创建MemberServiceImpl的实例(使用默认构造方法),然后将MemberDao这个属性也通过spring进行依赖注入
  4. 注意:进行依赖注入时如果是属性注入,需要给属性setter方法
  5. 在使用MemberServiceImpl的实例时,不能自己创建实例,因为自己创建的实例没有被依赖注入,是不能正常运行的!!!必须通过spring的ApplicationContext来获取被依赖注入的MemberServiceImpl对象
2.通过内部bean注入
beans.xml
    <!--通过内部bean来配置bean-->
    <bean class="com.sxs.spring.service.MemberServiceImpl" id="memberService2">
        <property name="memberDao">
            <!--这里通过内部的bean来实现依赖注入,将MemberDaoImpl的bean对象给了属性memberDao-->
            <bean class="com.sxs.spring.dao.MemberDaoImpl"/>
        </property>
    </bean>

4.不同类型的属性注入方式

1.List

image-20240216193131340

1.Master.java
package com.sxs.spring.bean;

import org.springframework.objenesis.instantiator.perc.PercInstantiator;

import java.util.*;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Master {
    private String name;
    private List<Monster> monstersList;
    private Map<String, Monster> monsterMap;
    private Set<Monster> monsterSet;
    private String[] monsterName;
    private Properties pros;

    public String getName() {
        return name;
    }

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

    public List<Monster> getMonstersList() {
        return monstersList;
    }

    public void setMonstersList(List<Monster> monstersList) {
        this.monstersList = monstersList;
    }

    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;
    }

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

2.beans.xml
    <!--属性注入:List类型-->
    <bean class="com.sxs.spring.bean.Master" id="master">
        <property name="name" value="list"/>
        <!--list类型的属性内部用list标签包裹,然后放入对象-->
        <property name="monstersList">
            <list>
                <!--1.引用bean对象-->
                <ref bean="monster"/>
                <ref bean="monster2"/>
                <!--2.反射创建bean对象-->
                <bean class="com.sxs.spring.bean.Monster">
                    <property name="name" value="111"/>
                    <property name="skill" value="111"/>
                    <property name="monsterId" value="111"/>
                </bean>
            </list>
        </property>
    </bean>
3.测试
    //依赖注入:list类型
    @Test
    public void List_() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Master master = ioc.getBean("master", Master.class);
        System.out.println(master);
    }

image-20240216195540484

2.Map
1.beans.xml
    <!--属性注入:Map类型-->
    <bean class="com.sxs.spring.bean.Master" id="master2">
        <property name="name" value="map"/>
        <property name="monsterMap">
            <map>
                <entry>
                    <!--key的配置-->
                    <key>
                        <value>monster</value>
                    </key>
                    <!--value的配置,这里是引用的bean对象-->
                    <ref bean="monster"/>
                </entry>
                <!--第二个K-V配置-->
                <entry>
                    <!--key的配置-->
                    <key>
                        <value>monster1</value>
                    </key>
                    <!--value的配置,这里是内部bean对象-->
                    <bean class="com.sxs.spring.bean.Monster" id="monster1">
                        <property name="name" value="222"/>
                        <property name="monsterId" value="222"/>
                        <property name="skill" value="222"/>
                    </bean>
                </entry>
            </map>
        </property>
    </bean>
2.测试
    //依赖注入:map类型
    @Test
    public void Map_() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Master master = ioc.getBean("master2", Master.class);
        System.out.println(master);
    }

image-20240216202240728

3.Set
1.beans.xml
    <!--属性注入:Set类型-->
    <bean class="com.sxs.spring.bean.Master" id="master3">
        <property name="monsterSet">
            <set>
                <!--跟list相似不过是在set标签下放对象-->
                <!--引用bean对象-->
                <ref bean="monster"/>
                <!--内部bean对象-->
                <bean class="com.sxs.spring.bean.Monster">
                    <property name="name" value="222"/>
                    <property name="monsterId" value="222"/>
                    <property name="skill" value="222"/>
                </bean>
            </set>
        </property>
    </bean>

2.测试
    //依赖注入:Set类型
    @Test
    public void Set_() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Master master = ioc.getBean("master3", Master.class);
        System.out.println(master);
    }

image-20240216203249023

4.Array
1.beans.xml
    <!--属性注入:数组类型-->
    <bean class="com.sxs.spring.bean.Master" id="master4">
        <property name="monsterName">
            <array>
                <!--由于这里使用的是String类型,所以直接使用value标签即可,具体根据业务来使用!-->
                <value>小妖怪</value>
                <value>中妖怪</value>
                <value>大妖怪</value>
            </array>
        </property>
    </bean>

2.测试
    //依赖注入:Array类型
    @Test
    public void Array_() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Master master = ioc.getBean("master4", Master.class);
        System.out.println(master);
    }

image-20240216204147279

5.Properties
1.beans.xml
    <!--属性注入:Properties类型-->
    <bean class="com.sxs.spring.bean.Master" id="master5">
        <property name="pros">
            <!--注意:properties是key-value类型的并且key和value都是String类型的-->
            <props>
                <prop key="username">111111</prop>
                <prop key="psssword">222222</prop>
                <prop key="ip">127.0.0.1</prop>
            </props>
        </property>
    </bean>
2.测试
    //依赖注入:Properties类型
    @Test
    public void Properties_() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Master master = ioc.getBean("master5", Master.class);
        System.out.println(master);
    }

6.util:list
1.BookStore.java
package com.sxs.spring.bean;

import java.util.List;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class BookStore {
    private List<String> bookList; //使用util:list进行属性注入

    //无参构造
    public BookStore() {}

    public List<String> getBookList() {
        return bookList;
    }

    public void setBookList(List<String> bookList) {
        this.bookList = bookList;
    }
}

2.beans.xml
    <!--使用util:list配置bean-->
    <util:list id="myBookList">
        <value>三国演义</value>
        <value>水浒传</value>
        <value>红楼梦</value>
        <value>西游记</value>
    </util:list>

    <bean class="com.sxs.spring.bean.BookStore" id="bookStore">
        <!--直接将list引进去即可-->
        <property name="bookList" ref="myBookList"/>
    </bean>
3.测试
    //依赖注入:util:list
    @Test
    public void UtilList() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        BookStore bean = ioc.getBean(BookStore.class);
        System.out.println(bean);
    }

image-20240218100020663

7.级联属性赋值

image-20240218100201828

1.Dept.java
package com.sxs.spring.bean;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Dept {
    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Dept{" +
                "name='" + name + '\'' +
                '}';
    }
}

2.Emp.java
package com.sxs.spring.bean;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Emp {
    private String name;
    private 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 +
                '}';
    }
}

3.beans.xml
    <!--级联属性赋值-->
    <!--这个bean对象先不要配置name,留给后面的直接配置-->
    <bean class="com.sxs.spring.bean.Dept" id="dept"/>
    <bean class="com.sxs.spring.bean.Emp" id="emp">
        <property name="name" value="王二虎"/>
        <property name="dept" ref="dept"/>
        <!--为属性的属性赋值-->
        <property name="dept.name" value="财务部"/>
    </bean>
4.测试
    //级联属性赋值
    @Test
    public void cascadingAttributes() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Emp bean = ioc.getBean(Emp.class);
        System.out.println(bean.getDept().getName());
    }

image-20240218101558063

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

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

相关文章

图与图搜索算法

图搜索算法是一个非常重要的概念&#xff0c;它是计算机科学中图论和算法设计的基础部分。在开始讨论图搜索算法之前&#xff0c;我们需要先理解什么是图以及图的基本结构。 什么是图&#xff1f; 图&#xff08;Graph&#xff09;是一种非线性数据结构&#xff0c;它由一组点…

通过vue完成表格数据的渲染展示和vue的生命周期及小结

案例 通过vue完成表格数据的渲染展示 把视图区展示的数据 死数据替换掉 从vue的数据模型中读取 展示在视图区 vue中的数据 模型是js中的自定义类型 形成的数组 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&l…

Mathorcup 甲骨文识别

本资源主要包含第2-4问&#xff0c;第一问直接使用传统图像处理即可&#xff0c;需要有很多步骤&#xff0c;这一步大家自己写就行。 2 第2问&#xff0c;甲骨文识别 2.1 先处理源文件 原文件有jpg和json文件&#xff0c;都在一个文件夹下&#xff0c;需要对json文件进行处理…

Python路面车道线识别偏离预警

程序示例精选 Python路面车道线识别偏离预警 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python路面车道线识别偏离预警》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

牛客Linux高并发服务器开发学习第三天

静态库的使用(libxxx.a) 将lession04的文件复制到lession05中 lib里面一般放库文件 src里面放源文件。 将.c文件转换成可执行程序 gcc main.c -o app main.c当前目录下没有head.h gcc main.c -o app -I ./include 利用-I 和head所在的文件夹&#xff0c;找到head。 main.c…

针对springcloud gateway 跨域问题解决方案

springcloud gateway版本 <spring-boot.version>2.3.3.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version>跨域问题说明 application:1 Access to XMLHttpRequest at https://xxxxxxxxxx from origin http://l…

<计算机网络自顶向下> 可靠数据传输的原理(未完成)

可靠数据传输&#xff08;rdt&#xff1a;Reliable Data Transfer&#xff09;的原理 rdt在应用层&#xff0c;传输层和数据链路层都很重要是网络TOP10问题之一信道的不可靠特点决定了可靠数据传输rdt的复杂性rdt_send: 被上层&#xff08;如应用层&#xff09;调用&#xff0…

IP-guard WebServer 权限绕过漏洞复现(QVD-2024-14103)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

Simlab python二次开发1-将所有缸套内表面半径加大1mm

Simlab python二次开发1-将所有缸套内表面半径加大1mm 1、打开模型文件2、getBodiesWithSubString&#xff08;&#xff09;从名字得到Bodies3、建Body类Group3.1、定义放入Group中的Bodies3.2、建Group 4、将缸套内表面建组&#xff0c;并扩半径1mm4.1、simlab.getBodiesFromG…

[生活][杂项] 上班党的注意事项

前言 目前是上班已经接近两年了&#xff0c;目前的状态是&#xff0c;一个人租了一个单间在上班。对于这种情况有以下几点需要注意。 钥匙问题&#xff0c;一定不要陷入钥匙丢失的情况&#xff01;一定不要陷入钥匙丢失的情况&#xff01;一定不要陷入钥匙丢失的情况&#xff…

OpenHarmony多媒体-video_trimmer

简介 videotrimmer是在OpenHarmony环境下&#xff0c;提供视频剪辑能力的三方库。 效果展示&#xff1a; 安装教程 ohpm install ohos/videotrimmerOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考 如何安装OpenHarmony ohpm包 。 使用说明 目前支持MP4格式。 视频…

Flattened Butterfly 扁平蝶形拓扑

Flattened Butterfly 扁平蝶形拓扑 1. 传统蝶形网络 Butterfly Topology2. 扁平蝶形拓扑 Flattened Butterfly3.On-Chip Flattened Butterfly 扁平蝶形拓扑应用于片上网络 Flattened Butterfly 扁平蝶形拓扑 扁平蝶形拓扑是一种经济高效的拓扑&#xff0c;适用于高基数路由器…

Golang入门基础

文章目录 Golang的背景知识Golang的发展历程Golang的特点Golang的应用领域 开发环境搭建下载并安装SDK包设置环境变量Go项目目录结构 注释变量标识符命名输入和输出运算符算术运算符关系运算符逻辑运算符赋值运算符位运算符其他运算符 Golang的背景知识 Golang的发展历程 Gola…

2024年华中杯数学建模竞赛ABC题思路分析

简单分析一下各个题目可能需要用到的方法和模型&#xff0c;完整代码和成品论文见文末 A题 太阳能路灯光伏板的朝向设计问题: 1. 球面几何、天文学相关知识,如赤纬角、太阳高度角、时角等概念和公式 2. 太阳辐射模型,根据太阳能辐射强度、大气衰减系数等计算地表太阳辐射强度…

2.核心概念与安装配置

核心概念与安装配置 文章目录 核心概念与安装配置1、核心概念Docker整体架构及底层通信原理 2、安装DockerCentos安装Docker引擎阿里云镜像加速Docker run的过程 3、Docker相关命令 1、核心概念 镜像&#xff08;image&#xff09; Docker 镜像&#xff08;Image&#xff09;就…

【三维Dvhop定位】基于麻雀搜索算法的多通信半径和跳距加权的三维Dvhop定位算法【Matlab代码#81】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. Dvhop定位算法2. 麻雀搜索算法3. 多通信半径和跳距加权策略3.1 多通信半径策略3.2 跳距加权策略 4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文…

Istio介绍

1.什么是Istio Istio是一个开源的服务网格&#xff08;Service Mesh&#xff09;框架&#xff0c;它提供了一种简单的方式来为部署在Kubernetes等容器编排平台上的微服务应用添加网络功能。Istio的核心功能包括&#xff1a; 服务治理&#xff1a;Istio能够帮助管理服务之间的…

openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置

文章目录 openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置266.1 查看当前数据盘的文件系统类型266.2 对于需要修改的磁盘&#xff0c;备份所需的数据至其他磁盘或其他服务器266.3 格式化磁盘为xfs文件系统266.4 执行**步骤一** openGauss学习笔记-…

allure2教程-3-测试报告定制

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节&#xff0c;我们学习一下pytestallure2生成html测试报告的方法&#xff0c;本小节我们学习一下allure2测试报告的定制。 allure2报告预览 预览网址&#xff1a;https://demo.qameta.io/allure/# allur…

WordPress的全面解析:为什么它是创建博客和网站的首选

在当前的数字化时代&#xff0c;无论是个人博客还是企业网站&#xff0c;都需要一个强大而灵活的平台以支撑其内容和用户交互。WordPress作为全球最流行的内容管理系统&#xff08;CMS&#xff09;&#xff0c;以其强大的功能、灵活的定制性和广泛的用户基础&#xff0c;成为了…