Spring学习:二、Bean的管理

news/2024/5/18 15:59:47/文章来源:https://blog.csdn.net/H215919719/article/details/128137571

4. Bean的管理

​ Spring的基本Bean管理包括Bean配置,Bean实例化和Bean的依赖注入。这些管理可以通过手工编码的方式把每个Bean注册到容器中,也可以通过properties文件和xml文件配置Bean和Bean之间的依赖关系。通常我们的配置方式是XML作为配置文件。

4.1 Bean的配置

​ 我们可以看一看前面例子的配置文件:

<bean id="dog" class="org.suke.Dog" ></bean>
<bean id="cat" class="org.suke.Cat" ></bean>
<bean id="boy" class="org.suke.Boy" ><property name="pet" ref="dog"></property>
</bean>

配置一个Bean,id为Bean的标识,在配置Bean时,可以使用name属性为Bean指定标识。id 和name 属性都是用来指定bean的标识符。id具有唯一性,并且是XML中真正的id属性,XML解析器可以验证其的合法性,在使用中必须和Java中命名变量一样去命名id的值,比如不能以数字开始等约束。name属性值则没有要求,甚至在name中可以使用特殊字符(如等)。

​ 如果在配置文件中既没有配置id,也没有配置name,Spring会默认使用类的全名来标识,如果需要配置多个类名相同的对象,则spirng会使用 类名+#+数字的形式来标识。即如果配置了三个<bean class="org.suke.Dog">,那么标识分别是 “org.suke.Dog”” org.suke.Dog #1”,和” org.suke.Dog #2”

​ name属性其实就是为该Bean指定的别名,多个别名之间使用”,”进行分隔。还可以使用< alias >来指定别名,比如上面的dog使用alias来配置别名可以做如下配置:

<bean id="dog" name="dog1,dog2,dog3" class="org.suke.Dog" />

<alias name="dog" alias="dog4"/>

​ 这样dog对象就被被标识为 dog,dog1,dog2,dog3,dog4这4个标识名,<alias>标记中的name可以是id的值,也可以是name的值(也就是说使用别名还可以再次重新命名),那么在程序中我们通过ApplicationContext对象或者BeanFactory的get方法获取bean对象的时候,就可以使用dog,dog1,dog2,dog3,dog4这4中标识中的任意一个来获取bean对象,获取到的bean对象都是同一个对象。

class是Bean的全限定名。

配置Bean的属性,name表示属性名,这个属性实际上是javaBean的setter方法,所以配置的类必须符合javaBean的规范。

④<property>节点可以通过ref属性引用其他已经配置的Bean,ref的值是其他已经配置Bean的标识。如果这个属性的值是基本数据类型或者是String类型,只要该属性具有setter访问器,就可以使用value直接设置值。

4.2 Bean的作用域(scope)

​ 配置文件中的Bean实例化后,该如何保存,就是Bean的作用域问题。比如:默认的作用域是singleton,表示对应Bean在容器中是单例的,整个系统只保存一份实例,实例化后即保存起来,直到系统结束才销毁,期间所有线程共享一份实例。Bean的作用域使用<bean>节点的scope属性来表示。

​ scope:指对象的作用范围,取值如下:

取值范围说明
singleton默认值,单例的
prototype多例的
requestWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
sessionWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global sessionWEB 项目中,应用在 Portlet 环境,没有 Portlet 环境globalSession 相当于session

重点是singleton与prototype两个作用域:

1)当scope的取值为singleton时

Bean的实例化个数:1个

Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

Bean的生命周期:

  • 对象创建:当应用加载,创建容器时,对象就被创建了

  • 对象运行:只要容器在,对象一直活着

  • 对象销毁:当应用卸载,销毁容器时,对象就被销毁了

2)当scope的取值为prototype时

Bean的实例化个数:多个

Bean的实例化时机:当调用getBean()方法时实例化Bean

  • 对象创建:当使用对象时,创建新的对象实例

  • 对象运行:只要对象在使用中,就一直活着

  • 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

public class HelloImpl implements IHello {public String sayHello(String word) {return "hello:"+word;}public HelloImpl() {System.out.println("HelloImpl实例进行初始化....");}
}
<bean class="com.suke.hello.impl.HelloImpl" id="hello" scope="singleton"></bean>

测试代码:

 @Testpublic void testScope(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");IHello hello = applicationContext.getBean("hello", IHello.class);IHello hello2 = applicationContext.getBean("hello", IHello.class);System.out.println("是否是同一个对象:"+(hello == hello2));}

测试结果:
在这里插入图片描述

现在我们把HelloImpl的bean设置为prototype,再来测试,看控制台的效果:

<bean class="com.suke.hello.impl.HelloImpl" id="hello" scope="prototype"></bean>

在这里插入图片描述

4.3 Bean的生命周期的配置

我们可以在Bean标签中使用init-method属性和destroy-method属性对bean的生命周期进行相关配置:

  • init-method:指定类中的初始化方法名称

init-method用于指定bean的初始化方法。 我们知道spring会帮我们实例化对象,实例化对象之后,spring就会查找我们是否配置了init-method如果配置了,spring就会调用我们配置的initmethod方法,进行bean的初始化。

  • destroy-method:指定类中销毁方法名称

destroy-methodinit-method一样,只是它是用来配置释放资源的方法,spring会在销毁当前bean对象之前调用destroy-method制定的方法。

package com.suke.hello.impl;import com.suke.hello.IHello;public class HelloImpl implements IHello {public String sayHello(String word) {return "hello:"+word;}public HelloImpl() {System.out.println("HelloImpl实例进行初始化....");}public void init(){System.out.println("哈哈,我出生了...");}public void destroy(){System.out.println("555,我要走了...");}
}
<bean class="com.suke.hello.impl.HelloImpl" id="hello"  init-method="init" destroy-method="destroy"></bean>

测试代码:

@Test
public void testLife(){AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");IHello hello = applicationContext.getBean("hello", IHello.class);hello.sayHello("spring");applicationContext.close();
}

测试效果:
在这里插入图片描述

4.4 Spring Bean 的加载流程概述

​ Spring 作为 Ioc 框架,实现了依赖注入,由一个中心化的 Bean 工厂来负责各个 Bean 的实例化和依赖管理。各个 Bean 可以不需要关心各自的复杂的创建过程,达到了很好的解耦效果。

​ springBean的加载过程大致分为两个过程:解析注册,实例化
在这里插入图片描述

​ spring先解析xml文件或者注解配置,读取所有要加载类信息。根据类信息创建对应的BeanDefinition对象,再根据Beandefination对象创建实例对象。

​ BeanDefinition是SpringBean的描述对象,主要封装了如下信息:

在这里插入图片描述

Spring通过BeanDefinition来进行bean的实例化, 实例化的bean存在BeanFactory的singletonObjects中
在这里插入图片描述

4.5 依赖注入属性配置

4.5.1 依赖注入二种方式

​ 在DI的案例中,我们在UserService中是怎么把UserDao注入进来的呢?其实在Spring中提供了两种注入方式:

  • Set方法的注入
  • 构造方法的注入
4.5.1.1 属性setter方法注入

通过 <property>元素,实现属性setter方法注入

package com.suke.injection;public class Dog {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
package com.suke.injection;public class Person {private String name;private Dog dog;public String getName() {return name;}public void setName(String name) {this.name = name;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}
}

配置:

 <bean id="d1" class="com.suke.injection.Dog"><property name="name" value="旺财"/></bean>

我们在使用property和constructor-arg为bean注入属性时,如果属性是简单类型,我们可以通过value直接注入。

这里简单类型主要是指java的基本类型和String型

<bean id="p1" class="com.suke.injection.Person"><property name="name" value="张三"/><property name="dog" ref="d1"/>
</bean>

当我们通知spring帮我们注入某个引用对象时,我们可以使用ref通知spring注入bean的beanName

4.5.1.2 P命名空间使用

​ Spring2.5 版本之后,为了简化属性setter依赖注入,提供虚拟名称空间 p ,使用步骤:

  1. 在spring的配置文件中<beans>标签引入p命令空间

     xmlns:p="http://www.springframework.org/schema/p"
    

在这里插入图片描述

  1. 使用p命令空间

    <bean id="d2" class="com.suke.injection.Dog"><property name="name" value="来福"/>
    </bean>
    <bean id="p2" class="com.suke.injection.Person" p:name="李四" p:dog-ref="d2"></bean>
4.5.1.3 构造方法注入

​ 通过 <constructor-arg> 进行构造器参数注入

​ 我们分别在Dog类和Person类提供了无参和有参的构造方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Noixp5l-1669895043785)(assets/image-20220731173131884.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKRWGN31-1669895043787)(assets/image-20220731173159237.png)]

配置:

<bean id="d3" class="com.suke.injection.Dog"><constructor-arg name="name" value="大黄"/>
</bean><bean id="p3" class="com.suke.injection.Person"><constructor-arg name="name" value="王五"/><constructor-arg name="dog" type="com.suke.injection.Dog" index="1" ref="d3"/>
</bean>

<constructor-arg>标签属性说明:

  • name: 属性名
  • type: 属性类型
  • index: 参数索引(从0开始)

4.5.2 集合属性的注入

​ 某些类的属性是可能是集合,包括:数组LISTMAPSETPROPERTIES等集合,在Spring中同样可以使用XML配置文件的方式对属性进行注入。

主要用于 参数配置 !

  • 数组或者List ----- <list>或者 <array>注入

  • Set ---- <set> 注入

  • Map — <map> <entry> 注入

  • Properties — <props> <prop> 注入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQslqlYO-1669895043787)(assets/image-20220731181126728.png)]

配置:

  <bean id="p4" class="com.suke.injection.Person"><property name="list"><list><value>aaa</value><value>bbb</value><value>aaa</value><value>ccc</value></list></property><property name="set"><set><value>aaa</value><value>bbb</value><value>aaa</value><value>ccc</value></set></property><property name="map"><map><entry key="abc" value="123"></entry><entry key="bcd" value="456"></entry><entry key="efg" value="567"></entry></map></property><property name="props"><props><prop key="zhangsan">张三</prop><prop key="lisi">李四</prop><prop key="wangwu">王五</prop></props></property></bean>

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

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

相关文章

DNS查询流程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 计算机网络 ❤️ 支持我&#xff1a;&#x1f44d;点赞 &#…

李宏毅《DLHLP》学习笔记6 - 语言模型

视频链接&#xff1a;https://www.youtube.com/watch?vdymfkWtVUdo&listPLJV_el3uVTsO07RpBYFsXg-bN5Lu0nhdG&index8&ab_channelHung-yiLee 课件链接&#xff1a;https://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/ASR3.pdf 1. Language Model LM的作用是预…

FFmpeg二次开发

本文主要讲解 FFmpeg 的二次开发&#xff0c;ffmpeg.exe 的命令行功能特别强大&#xff0c;很多需求都能直接用命令行实现&#xff0c;但是总有一些需求用 命令行实现不太好做。 而你实现那些特殊需求&#xff0c;通常需要把 ffmpeg.exe 里面的某部分代码抄过来&#xff0c;本…

阿里云新用户活动:云服务器ECS 新购、升级报价出炉了!

阿里云新人特惠&#xff0c;阿里云新用户新购升级立享满减&#xff0c;新购升级云服务器ECS &#xff0c;购买热门产品 s6/u1/c6/g6/r6/c7/g7/r7指定配置&#xff0c;可享折上折&#xff01;从未购买过云服务器ECS或者轻量应用服务器的用户一次性可领取3张优惠券。优惠券适用于…

VS Code快速实现Git PR操作

注意&#xff1a;建议先学习git的基本操作。 安装插件 下图中红圈标记的插件都安装好。 Fork上游仓库 在网页上点击你想要fork的仓库&#xff0c;点击fork 然后该仓库就会fork到你的github账户下面&#xff0c;如下图。 现在可以在你账户下面的repo&#xff08;我们称为下…

Allegro如何移动器件操作指导

Allegro如何移动器件操作指导 Allegro上可以任意移动器件,具体操作如下 选择Edit-move Find选择Symbols Point根据需要选择 Sym Origin是抓取器件的原点 Body center是抓取器件的中心 User Pick可以自定义抓取的原点,在移动整个模块的并且旋转的时候常用的命令 Sym Pin#设…

【抓包工具】win 10 / win 11:WireShark 下载、安装、使用

目录 一、WireShark 下载 二、WireShark 安装 &#xff08;1&#xff09;双击运行安装程序 &#xff08;2&#xff09;Choose Components&#xff1a;选择组件 &#xff08;3&#xff09;Additional Tasks&#xff1a;附加任务 &#xff08;4&#xff09;Choose lnstall …

Pikachu靶场全关攻略(超详细!)

一、靶场搭建 准备工具 phpstudy**pikachu靶场下载地址&#xff1a;**https://github.com/zhuifengshaonianhanlu/pikachu 搭建过程 将靶场文件夹放到phpstudy的www目录 进入pikach文件夹的inc目录&#xff0c;修改靶场配置文件config.inc.php&#xff0c;设置数据库账号密…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.6 容器命令练习

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.6 容器命令练习10.6.1 直接开干10 使用Docker 10.6 容器…

Stable Diffusion 2.0 来了

Stable Diffusion 一经发布&#xff0c;就立刻在业界掀起巨大的波浪。我个人后知后觉&#xff0c;直到 Stable Diffusion V1.4 版本发布&#xff0c;才接触 Stable Diffusion (之前使用的是 Disco Diffusion)。这段时间&#xff0c;SD 团队也没闲着&#xff0c;很快就发布了 V2…

HTML学生个人网站作业设计 明星易烊千玺介绍(HTML+CSS) web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

2022年第十一届认证杯数学中国数学建模国际赛小美赛:C 题 对人类活动进行分类 建模方案及代码实现

2022年第十一届认证杯数学中国数学建模国际赛小美赛&#xff1a;C 题 对人类活动进行分类 建模方案及代码实现 1 题目 人类行为理解的一个重要方面是对日常活动的识别和监控。可穿戴活动识别系统可以在许多关键领域提高生活质量&#xff0c;如门诊监测、居家康复、跌倒检测等。…

[附源码]计算机毕业设计springboot校园代取快递系统

项目运行 环境配置&#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…

GameOff2022参与有感

GameOff2022参与有感以及年度总结 厚颜无耻的用我们美术的立绘 GameOff— Redemption 很高兴在一个月的时间里面和大家一起完成了《Redemption》 比赛链接&#xff1a;Itch.io 百度云盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ylK0QRr2lmkqi4JF1wsXtA 提…

[附源码]计算机毕业设计springboot疫情管理系统

项目运行 环境配置&#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…

天宇优配|研判明年下半年投资机会或更大 险资看好“安全”与“发展”

上海证券报记者昨日获悉&#xff0c;多家稳妥资管公司已经拟定2023年出资战略&#xff0c;跟着本年以来多项稳经济方针逐步落地&#xff0c;险资遍及看好下一年经济复苏带来的商场出资时机。 权益出资方面&#xff0c;险资以为&#xff0c;当时股票商场估值处于前史较低水平&am…

重点问题!CPU利用率过高排查思路|原创

本文讲解了重点面试问题CPU利用率高如何排查和解决。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达CPU利用率高怎么办&#xff1f;如何排查和解决这是一个常见的面试问题&#xff0c;也是线上常遇到的问题之一。遇到线上服务器异常告警&…

Maven的简单介绍

Maven 构件 <packaging> : pom、jar、ear、war以及maven-plugin,构建Maven之后所生成的文件类型&#xff0c;Pom本身不产生构件&#xff0c;用来作为依赖库。 pom类型常用于微服务中作为父Pom,通过 可以将子模块包含进来&#xff0c;共享父Pom的依赖&#xff0c; GAV坐标…

第十五章 如何编写README文档

README 文档对于开源项目的重要性甚至会超过代码本身。你试想一下&#xff0c;你打开一个 Github 项目&#xff0c;第一时间就会看到 README 文档&#xff0c;而这时候同一类的项目你可能有很多选择&#xff0c;如果这个README不正规&#xff0c;无法快速上手&#xff0c;你可能…

ICS计算系统概论实验3—LC3汇编代码实现最长重复子字符串Longest-duplicate-substring

Lab03 Longest-duplicate-substring Purpose 子字符串是字符串中至少出现一次的连续字符序列。重复子字符串是一种由相同字符组成的子字符串。例如&#xff0c;“aabbbc”的重复子字符串是“aa”&#xff0c;“bbb”和“c”。 给定一个字符串及其长度&#xff0c;计算出它最长…