【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean

【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean
在这里插入图片描述
文章目录🌍一. spring学习的核心内容🌍二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过构造器配置 bean3. 通过 p 名称空间配置 bean4. 引用/注入其它 bean 对象5. 引用/注入内部 bean 对象6. 引用/注入集合/数组类型7. 级联属性赋值8. 通过静态工厂获取对象9. 通过实例工厂获取对象10. 通过 FactoryBean 获取对象(重点)11. bean 配置信息重用(继承)

🙋‍♂️ 作者:@whisperrr.🙋‍♂️

👀 专栏:spring👀

💥 标题:【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean💥

❣️ 寄语:比较是偷走幸福的小偷❣️

🌍一. spring学习的核心内容

  1. Spring 核心学习内容 IOC、AOP, jdbcTemplate, 声明式事务
  2. IOC: 控制反转 , 可以管理 java 对象
  3. AOP : 切面编程
  4. JDBCTemplate : 是 spring 提供一套访问数据库的技术, 应用性强,相对好理解

声明式事务: 基于 ioc/aop 实现事务管理,

在这里插入图片描述

Spring 几个重要概念

Spring 可以整合其他的框架(解读: Spring 是管理框架的框架)
Spring 有两个核心的概念: IOC 和 AOP
IOC [Inversion Of Control 反转控制]

2.为什么学习spring,我们看一下传统的开发模式

在这里插入图片描述


上图连接到数据库为例说明

程序员编写程序, 在程序中读取配置信息
创建对象, new Object???() // 反射方式
使用对象完成任务

而IOC 的开发模式 [EmpAction EmpService EmpDao Emp]程序<-----容器

在这里插入图片描述
解读上图
1.Spring 根据配置文件 xml/注解, 创建对象, 并放入到容器(ConcurrentHashMap)中,并且可以完成对象之间的依赖
2.当需要使用某个对象实例的时候, 就直接从容器中获取即可
3.程序员可以更加关注如何使用对象完成相应的业务, (以前是 new … ==> 注解/配置方式)
4.DI—Dependency Injection 依赖注入,可以理解成是 IOC 的另外叫法.
5.Spring 最大的价值,通过配置,给程序提供需要使用的web 层[Servlet(Action/Controller)]/Service/Dao/[JavaBean/entity]对象,这个是核心价值所在,也是 ioc 的具体体现, 实现解耦.

3.Debug 看一下 Spring 容器的处理机制,

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

Spring管理 Bean-IOC

Bean管理包括两方面,创建 bean 对象和给 bean 注入属性,Bean 配置方式也有两种,基于 xml 文件配置方式和基于注解方式

🌍二. 基于 XML 配置 bean

1. 通过类型来获取 bean

通过 spring 的 ioc 容器, 获取一个 bean 对象

  1. 创建 Monster.java
  2. 在 beans.xml 配置(说明前面已经配置好了)
解读:
1. 配置monster对象/javabean
2. 在beans中可以配置多个bean
3. bean表示就是一个java对象
4. class属性是用于指定类的全路径->spring底层使用反射创建
5. id属性表示该java对象在spring容器中的id, 通过id可以获取到对象
6. 用于给该对象的属性赋值
<beanid="monster01"class="com.hspedu.spring.beans.Monster"><propertyname="monsterId"value="1"/><propertyname="name"value="牛魔王"/><propertyname="skill"value="牛魔王拳"/></bean>

完成测试

ApplicationContext ioc =newClassPathXmlApplicationContext("beans.xml");Monster monster = ioc.getBean(Monster.class);

细节说明

  1. 这种方式的应用场景:比如 XxxAction/Servlet/Controller, 或 XxxService 在一个线程
    中只需要一个对象实例(单例)的情况
  2. 说明一下: 在容器配置文件(比如 beans.xml)中给属性赋值, 底层是通过
    setter 方法完成的, 这也是为什么我们需要提供 setter 方法的原因

按类型来获取 bean, 要求 ioc 容器中的同一个类的 bean 只能有一个, 否则会抛出异常
NoUniqueBeanDefinitionException

在这里插入图片描述

2. 通过构造器配置 bean

在 spring 的 ioc 容器, 可以通过构造器来配置 bean 对象

解读
1. constructor-arg标签可以指定使用构造器的参数
2. index表示构造器的第几个参数 从0开始计算的
3. 除了可以通过index 还可以通过 name / type 来指定参数方式
4. 解除大家的疑惑, 类的构造器,不能有完全相同类型和顺序的构造器,所以可以通过type来指定
<beanid="monster02"class="com.hspedu.spring.beans.Monster"><constructor-argvalue="2"index="0"/><constructor-argvalue="蜘蛛精"index="1"/><constructor-argvalue="吐口水"index="2"/></bean>

数据类型就是对应的 Java 数据类型,按构造器参数顺序

<beanid="monster03"class="com.hspedu.spring.beans.Monster"><constructor-argvalue="3"type="java.lang.Integer"/><constructor-argvalue="白骨精"type="java.lang.String"/><constructor-argvalue="白骨鞭"type="java.lang.String"/></bean>

完成测试

ApplicationContext ioc =newClassPathXmlApplicationContext("beans.xml");Object monster02 = ioc.getBean("monster02");Object monster03 = ioc.getBean("monster03");
通过 index 属性来区分是第几个参数
通过 type 属性来区分是什么类型(按照顺序)

3. 通过 p 名称空间配置 bean

在 spring 的 ioc 容器, 可以通过 p 名称空间来配置 bean 对象
完成步骤

  1. 在 beans.xml 配置, 增加命名空间配置
  2. xmlns:p="http://www.springframework.org/schema/p"
1.将光标放在p , 输入alt+enter , 就会自动的添加xmlns
2.有时需要多来几次
<beanid="monster04"class="com.hspedu.spring.beans.Monster"> p:monsterId="4" p:name="红孩儿" p:skill="吐火~" /> 

完成测试

ApplicationContext ioc =newClassPathXmlApplicationContext("beans.xml");Monster monster04 = ioc.getBean("monster04",Monster.class);

4. 引用/注入其它 bean 对象

在 spring 的 ioc 容器, 可以通过 ref 来实现 bean 对象的相互引用

  1. 其它含义和前面一样
  2. ref 表示 memberDAO 这个属性将引用/指向 id = memberDAOImpl 对象
解读
1.ref="memberDAO"表示 MemberServiceImpl对象属性memberDAO引用的对象是id=memberDAO 的对象
2.这里就体现出spring容器的依赖注入
3.注意再spring容器中, 他是作为一个整体来执行的, 即如果你引用到一个bean对象, 对你配置的顺序没有要求
4.建议还是按顺序,好处是阅读的时候,比较方便
<beanid="memberServiceImpl"class="com.hspedu.spring.service.MemberServiceImpl"><propertyname="memberDAO"ref="memberDAOImpl"/></bean><beanid="memberDAOImpl"class="com.hspedu.spring.dao.MemberDAOImpl"/>

5. 引用/注入内部 bean 对象

<beanid="memberServiceImpl02"class="com.hspedu.spring.service.MemberServiceImpl"><propertyname="memberDAO"><beanclass="com.hspedu.spring.dao.MemberDAOImpl"/></property></bean>

6. 引用/注入集合/数组类型

给 bean 对象的 list 集合赋值

<beanid="master01"class="com.hspedu.spring.beans.Master"><propertyname="name"value="太上老君"/><propertyname="monsterList"><list><refbean="monster03"/><refbean="monster02"/></list></property>

给 bean 对象的 map 集合赋值

<propertyname="monsterMap"><map><entry><key><value>monsterKey01</value></key><refbean="monster01"/></entry><entry><key><value>monsterKey02</value></key><refbean="monster02"/></entry></map></property>

给 bean 对象的 properties 集合赋值结构k(String)-v(String)

<propertyname="pros"><props><propkey="k1">Java 工程师</prop><propkey="k2">前端工程师</prop><propkey="k3">大数据工程师</prop></props></property>

给 bean 对象的数组属性注入值 ,array标签中使用 value 还是 bean , ref … 要根据你的业务决定

<propertyname="monsterName"><array><value>银角大王</value><value>金角大王</value></array></property>

给 bean 对象的 set 属性注入值

<propertyname="monsterSet"><set><refbean="monster01"/><beanclass="com.hspedu.spring.beans.Monster"><propertyname="monsterId"value="10"/><propertyname="name"value="玉兔精"/><propertyname="skill"value="钻地洞"/></bean></set></property></bean>

1.主要掌握 List/Map/Properties 三种集合的使用.
2.Properties 集合的特点

1)这个 Properties 是 Hashtable 的子类 , 是 key-value 的形式
2)key 是 string 而 value 也是 string

7. 级联属性赋值

spring 的 ioc 容器, 可以直接给对象属性的属性赋值, 即级联属性赋值

<beanid="emp"class="com.hspedu.spring.beans.Emp"><propertyname="name"value="jack"/><propertyname="dept"ref="dept"/><propertyname="dept.name"value="Java 开发部"/></bean><beanid="dept"class="com.hspedu.spring.beans.Dept"/>

8. 通过静态工厂获取对象

先创建一个静态工厂

publicclassMyStaticFactory{privatestaticMap<String,Monster> monsterMap;static{ monsterMap =newHashMap<String,Monster>(); monsterMap.put("monster_01",newMonster(100,"黄袍怪","一阳指")); monsterMap.put("monster_02",newMonster(200,"九头金雕","如来神掌"));}publicstaticMonstergetMonster(String key){return monsterMap.get(key);}}

修改 beans.xml , 增加配置

1 通过静态工厂获取/配置bean
2. class 是静态工厂类的全路径
3. factory-method 表示是指定静态工厂类的哪个方法返回对象
4. constructor-arg value=“monster02” value是指定要返回静态工厂的哪个对象
<!-- 通过静态工厂来获取 bean 对象 --><beanid="my_monster"class="com.hspedu.spring.factory.MyStaticFactory"factory-method="getMonster"><!-- constructor-arg 标签提供 key --><constructor-argvalue="monster_01"/></bean>

通过这个静态工厂获取的对象是同一个

9. 通过实例工厂获取对象

在 spring 的 ioc 容器, 可以通过实例工厂获取 bean 对象

publicclassMyInstanceFactory{privateMap<String,Monster> monster_map;//非静态代码块{ monster_map =newHashMap<String,Monster>(); monster_map.put("monster_01",newMonster(100,"猴子精","吃人")); monster_map.put("monster_02",newMonster(200,"九头金雕","如来神掌"));}publicMonstergetMonster(String key){return monster_map.get(key);}}

配置 beans.xm

1.factory-bean 指定使用哪个实例工厂对象返回bean
2. factory-method 指定使用实例工厂对象的哪个方法返回bean
3. constructor-arg value=“monster03” 指定获取到实例工厂中的哪个monster
<beanid="myInstanceFactory"class="com.hspedu.spring.factory.MyInstanceFactory"/><beanid="my_monster2"factory-bean="myInstanceFactory"factory-method="getMonster"><constructor-argvalue="monster_02"/></bean>

通过这个实例工厂获取的对象是同一个,如果创建两次实例工厂,再分别获取对象就不是同一个,这是和静态工厂的区别。

10. 通过 FactoryBean 获取对象(重点)

publicclassMyFactoryBeanimplementsFactoryBean<Monster>{privateString keyVal;privateMap<String,Monster> monster_map;{ monster_map =newHashMap<String,Monster>(); monster_map.put("monster_01",newMonster(100,"黄袍怪","一阳指")); monster_map.put("monster_02",newMonster(200,"九头金雕","如来神掌"));}publicvoidsetKeyVal(String keyVal){this.keyVal = keyVal;}@OverridepublicMonstergetObject()throwsException{// TODO Auto-generated method stubreturnthis.monster_map.get(keyVal);}@OverridepublicClassgetObjectType(){// TODO Auto-generated method stubreturnMonster.class;}@OverridepublicbooleanisSingleton(){// TODO Auto-generated method stubreturntrue;}}
解读
1.通过 FactoryBean 来获取 bean 对象
2.name=“keyVal” 就是 MyFactoryBean 定义的 setKeyVal 方法
3.value=“monster_01” ,就是给 keyVal 的值
<beanid="myFactoryBean"class="com.hspedu.spring.factory.MyFactoryBean"><propertyname="keyVal"value="monster_01"/></bean>

11. bean 配置信息重用(继承)

在 spring 的 ioc 容器, 提供了一种继承的方式来实现 bean 配置信息的重用

<!-- 继承的方式来实现 bean 配置信息的重用 --><beanid="monster10"class="com.hspedu.spring.beans.Monster"><propertyname="monsterId"value="10"/><propertyname="name"value="蜈蚣精"/><propertyname="skill"value="蜇人"/></bean><!-- parent="monster10" 就是继承使用了 monster10 的配置信息 --><beanid="monster11"class="com.hspedu.spring.beans.Monster"parent="monster10"/><!-- 当我们把某个bean设置为 abstract="true" 这个bean只能被继承,而不能实例化了 --><beanid="monster12"class="com.hspedu.spring.beans.Monster"abstract="true"><propertyname="monsterId"value="12"/><propertyname="name"value="美女蛇"/><propertyname="skill"value="吃人"/></bean><!-- parent="monster12" 就是继承使用了 monster12 的配置信息 --><beanid="monster13"class="com.hspedu.spring.beans.Monster"parent="monster12"/>

Read more

NVIDIA Jetson Orin Nano双目视觉机器人避障系统开发全流程

NVIDIA Jetson Orin Nano双目视觉机器人避障系统开发全流程

文章目录 * 摘要 * 1. 系统架构设计 * 1.1 硬件组成 * 1.2 软件架构 * 2. 开发环境配置 * 2.1 系统安装 * 2.2 ROS2环境安装 * 2.3 双目相机驱动安装 * 3. 核心算法实现 * 3.1 深度感知模块 * 3.2 运动控制模块 * 4. 系统集成与部署 * 4.1 启动文件配置 * 4.2 包配置文件 * 5. 系统优化与调试 * 5.1 性能优化策略 * 5.2 常见问题处理 * 6. 成果展示与测试 * 7. 完整技术图谱 * 结论

By Ne0inhk
基于大数据爬虫+Hadoop+电脑商品数据爬取与可视化平台设计与开发(源码+精品论文+答辩PPT等资料)

基于大数据爬虫+Hadoop+电脑商品数据爬取与可视化平台设计与开发(源码+精品论文+答辩PPT等资料)

博主介绍:ZEEKLOG毕设辅导第一人、靠谱第一人、全网粉丝50W+,ZEEKLOG特邀作者、博客专家、腾讯云社区合作讲师、ZEEKLOG新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习、SSM、HLMT、Jsp、PHP、Nodejs、Python、等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码、文档辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。 🍅文末获取源码联系🍅 🍅文末获取源码联系�

By Ne0inhk
TensorFlow深度学习实战(22)——Transformer架构详解与实现

TensorFlow深度学习实战(22)——Transformer架构详解与实现

TensorFlow深度学习实战(22)——Transformer架构详解与实现 * 0. 前言 * 1. Transformer 架构 * 1.1 关键思想 * 1.2 计算注意力 * 1.3 编码器-解码器架构 * 1.4 Transformer 架构 * 1.5 模型训练 * 2. Transformer 类别 * 2.1 解码器(自回归)模型 * 2.2 编码器(自编码)模型 * 2.3 Seq2seq * 3. 经典注意力机制 * 3.1 稀疏注意力 * 3.2 LSH 注意力 * 3.

By Ne0inhk
SQL Server 2019安装教程(超详细图文)

SQL Server 2019安装教程(超详细图文)

SQL Server 介绍) SQL Server 是由 微软(Microsoft) 开发的一款 关系型数据库管理系统(RDBMS),支持结构化查询语言(SQL)进行数据存储、管理和分析。自1989年首次发布以来,SQL Server 已成为企业级数据管理的核心解决方案,广泛应用于金融、电商、ERP、CRM 等业务系统。它提供高可用性、安全性、事务处理(ACID)和商业智能(BI)支持,并支持 Windows 和 Linux 跨平台部署。 一、获取 SQL Server 2019 安装包 1. 官方下载方式 前往微软官网注册账号后,即可下载 SQL Server Developer 版本(

By Ne0inhk