基于XML配置bean(一)

文章目录

    • 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对象@Testpublic 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对象@Testpublic 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对象@Overridepublic 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需要使用daoMemberDao 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@Testpublic 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;}@Overridepublic 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类型@Testpublic 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类型@Testpublic 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类型@Testpublic 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类型@Testpublic 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类型@Testpublic 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@Testpublic 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;}@Overridepublic 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;}@Overridepublic 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.测试
    //级联属性赋值@Testpublic void cascadingAttributes() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");Emp bean = ioc.getBean(Emp.class);System.out.println(bean.getDept().getName());}

image-20240218101558063

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

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

相关文章

DDoS攻击趋势分析及防御建议:网络安全新挑战与应对策略

在数字化日益普及的今天&#xff0c;网络安全问题日益凸显。其中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其巨大的破坏力和难以防范的特性&#xff0c;发起简单、效果显著、难以追踪等特点&#xff0c;因此被黑客广泛使用&#xff0c;已经成为网络安全领…

Python(九十四)变量的作用域

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

CSS 设置空格原样显示 white-space:pre-wrap;

CSS 设置空格原样显示 问题描述 html 渲染内容时&#xff0c;对于 空格、回车、Tab 键的 默认处理方式是 &#xff1a; 无论存在多少个连续的空格&#xff0c;都只会保留一个。 结论 由于以上的特性&#xff0c;导致了我们无法直接渲染出原格式的文本。pre 标签 了解一下 &…

element-plus中的图标和文字水平对齐

<span><el-icon size"14px"><Delete /></el-icon> <span>删除</span> </span>解决方法&#xff1a;加上vertical-align: middle样式就可以了 <span><el-icon size"14px" style"vertical-align: …

【STM32CubeIDE 1.15.0】汉化包带路径配置过程

一、IDE软件下载 二、汉化版包路径 三、IDE软件板载汉化包 一、IDE软件下载 ST官网IDE下载链接 二、汉化版包路径 https://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/ 找不到就到.cn后面一级一级进 三、IDE软件板载汉化包 https://mirrors.ustc.edu…

数据库工具解析之 OceanBase 数据库导出工具

背景 大多数的数据库都配备了自己研发的导入导出工具&#xff0c;对于不同的使用者来说&#xff0c;这些工具能够发挥不一样的作用。例如&#xff1a;DBA可以使用导数工具进行逻辑备份恢复&#xff0c;开发者可以使用导数工具完成系统间的数据交换。这篇文章主要是为OceanBase…

​波士顿动力发布全新人形机器人:Atlas

4月16日&#xff0c;波士顿动力&#xff08;Boston Dynamics&#xff09;发布了《再见&#xff0c;液压Atlas》视频&#xff0c;正式宣告其研发的液压驱动双足人形机器人Atlas退役。 在视频的结尾&#xff0c;Atlas深深鞠躬&#xff0c;之后还有一句话“直到我们再次相遇&…

B1098 岩洞施工

solution #include<iostream> using namespace std; int main(){int n, x, top 1000, down 0;//管道水平放入>顶部最低点和底部最高点之间的距离就是能够承担的最大宽度scanf("%d", &n);for(int i 0; i < n; i){scanf("%d", &x);i…

3D模型处理的多进程并行【Python】

今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息&#xff0c;并分享我发现的一些小技巧&#xff0c;例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生…

AI论文速读 | 2024[VLDB]TFB:全面与公正的时间序列预测方法基准测试研究

论文标题&#xff1a;TFB: Towards Comprehensive and Fair Benchmarking of Time Series Forecasting Methods 作者&#xff1a;Xiangfei Qiu ; Jilin Hu&#xff08;胡吉林&#xff09; ; Lekui Zhou ; Xingjian Wu ; Junyang Du ; Buang Zhang ; Chenjuan Guo&#xff08;郭…

【软件】如何下载谷歌安装包?

1、访问谷歌浏览器官网&#xff1a;https://www.google.cn/chrome/index.html 2、在浏览器地址栏最后添加?standalone1&#xff0c;按回车&#xff0c;重新加载页面。页面和之前的一样&#xff0c;点击下载 完整地址&#xff1a;https://www.google.cn/chrome/index.html?…

2024年第十六届“华中杯”(A题)大学生数学建模挑战赛| 物理建模,多目标优化| 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看华中杯 (A题&#xff09;&#xff01; CS团队倾…

Java面试八股之Iterator和ListIterator的区别是什么

Iterator和ListIterator的区别是什么 这道题也是考查我们对迭代器相关的接口的了解程度&#xff0c;从代码中我们可以看出后者是前者的子接口&#xff0c;在此基础上做了一些增强&#xff0c;并且只用于List集合类型。 定义与基本概念 Iterator&#xff1a; 定义&#xff1a…

虚拟人多元化互动玩法,助力各领域发布会/直播活动“玩转”营销新高度

在数字新科技推动下&#xff0c;各地方文旅、品牌纷纷在发布会、展会、行业峰会论坛、推广直播等场景中&#xff0c;融入虚拟人IP&#xff0c;将虚拟人IP作为虚拟主播、虚拟主持人、虚拟嘉宾、虚拟推荐官、AI数字迎宾员、AI播报员等多重身份&#xff0c;与观众实时互动交流&…

【动态规划】C++解决斐波那契模型题目(三步问题、爬楼梯、解码方法...)

1. 前言 - 介绍动态规划算法 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09; 是一种解决复杂问题的算法设计技术&#xff0c;通常用于解决具有重叠子问题和最优子结构性质的问题。它将问题分解成较小的子问题&#xff0c;通过解决这些子问题并保存其…

NFTScan | 04.08~04.14 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.04.08~ 2024.04.14 NFT Hot News 01/ 数据&#xff1a;Runestone 地板价突破 0.07 BTC&#xff0c;创历史新高 4 月 8 日&#xff0c;据数据显示&#xff0c;Runestone 地板价突破 …

阿里面试:DDD中的实体、值对象有什么区别?

在领域驱动设计&#xff08;DDD&#xff09;中&#xff0c;有两个基础概念&#xff1a;实体&#xff08;Entity&#xff09;和值对象&#xff08;Value Object&#xff09;。 使用这些概念&#xff0c;我们可以把复杂的业务需求映射成简单、明确的数据模型。正确使用实体和值对…

Java详解:GUI容器组件 | 功能组件

✎ 简介&#xff1a; Graphical User Interface&#xff08;GUI&#xff09;图形用户界面 图形界面对于用户来说在视觉上更易于接受. ✎ 关于swing: • swing是一个为java设计的GUI工具包javax.swing&#xff0c;包括了用户界面的各种组件. • swing中组件可以分为两大类&…

基于FPGA的OMEGA东京奥运会计时器

截至2019年共举办了31届奥运会&#xff0c;其中27届的计时设备都由欧米茄&#xff08;OMEGA&#xff0c;Ω&#xff09;提供&#xff0c;今年的东京奥运会将会是第28届。 瑞士计时公司&#xff08;Swiss Timing&#xff09;基于火星Mars ZX2核心板打造了为奥运会等大型体育赛事…

AWVS+子域名平台联合自动化渗透测试工具(非常详细)零基础入门到精通,收藏这一篇就够了

项目地址 https://github.com/Minority2310/awvs-subdomain_platformawvs-subdomain_platform&#xff1a;AWVS子域名平台联合自动化渗透测试 如有侵权&#xff0c;请联系删除 为了帮助大家更好的学习网络安全&#xff0c;我给大家准备了一份网络安全入门/进阶学习资料&#…