Spring 项目创建和使用2 (Bean对象的存取)

news2024/11/23 16:59:52

目录

一、创建 Bean 对象

二、将Bean对象存储到 Spring容器中

三、创建 Spring 上下文(得到一个Spring容器)

 1. 通过在启动类中 ApplicationContext 获取一个 Spring容器

 2. 通过在启动类种使用 BeanFactory 的方式来得到 Spring 对象 (此时获取 Bean 的路径也要保持一致)

四、从 Spring 容器中获取到 Bean 对象(并使用Bean对象)

1. 通过名称(.xml文件中设置的 id )

     使用Applicationcontext 和 BeanFactory 的区别

  (1)所以二者的区别之一:

  (2)第二个区别:

 2. 通过类型的方式获取 Bean 对象

 3. 通过名称 + 类型的方式获取 Bean 对象

(1)先在.xml 文件中存储两个相同的 Bean 对象,然后再进行验证。

 四、什么是DI(依赖注入)


前言

    上一篇文章已经详细介绍了如何创建一个 Spring 项目,在创建好了 Spring 项目之后,就需要使用 Spring 容器存储和获取 Bean 对象了。 

    (Bean对象:在Java中,如果一个对象被使用多次,此时就可以成这个对象为 Bean 对象)

一、创建 Bean 对象

public class Student {
    private void sayHi() {
        System.out.println("Hii student");
    }
}

二、将Bean对象存储到 Spring容器中

    此时存储 Bean 对象是要依赖于xml配置文件的,里面要有一些配置信息,之后才能将 Bean对象存储到 Spring 容器中,如下图:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com.bit.service"></content:component-scan>
</beans>

    之后将上述代码复制到创建的配置文件 spring-config.xml 文件中

     在上述配置文件中添加下边代码:

 <!--将 bean对象(com.spring.demo.Student)存到spring容器中,他的名称叫做student -->
    <bean id="student" class="com.spring.demo.Student"></bean>

    此时就把一个 Bean 对象(Student类)存储到 Spring 中了,接下来就是取出 Bean 对象了。

三、创建 Spring 上下文(得到一个Spring容器)

    要想得到一个 Spring 容器有两种方式:

1.
ApplicationContext context = new
        ClassPathXmlApplicationContext("spring-config.xml");
2. 
//1. 得到Spring上下文对象
BeanFactory beanFactory =
        new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

 1. 通过在启动类中 ApplicationContext 获取一个 Spring容器

    此时需要注意:参数中的配置路径就是.xml 文件的名称,只有设置了这个文件名称,在程序运行的时候才会去这个文件中将 Bean 对象存储到 Spring 容器中。 

 2. 通过在启动类种使用 BeanFactory 的方式来得到 Spring 对象 (此时获取 Bean 的路径也要保持一致)

四、从 Spring 容器中获取到 Bean 对象(并使用Bean对象)

    获取 Bean 对象有三种方式:用的方法都是一样的,只是getBean()方法的传的参数不同

1. 通过名称获取
2. 通过类型获取
3. 通过名称 + 类型的方式获取

1. 通过名称(.xml文件中设置的 id )

//2. 从Spring容器中获取到Bean对象
        Student student = (Student) context.getBean("student");
        //3.使用Bean对象
        student.sayHi();

    此时需要  注意:getBean方法中的参数是 Bean 对象中的名称,此时需要和 spring-config.xml 文件中的 Bean 对象的 id 设置的名称保持相同。

    获取 Bean 对象之后我们可以使用 Student 类的sayHi方法证明以下  Bean 对象是否可以正常使用:

    使用BeanFactory的方式获取并使用 Bean对象

     使用Applicationcontext 和 BeanFactory 的区别

    此时再创建一个新的Teacher类,然后在Student 和 Teacher 类中都加上构造方法,如下代码:

public class Student {
    public Student() {
        System.out.println("do student init");
    }
    public void sayHi() {
        System.out.println("Hii student");
    }
}

public class Teacher {
    public Teacher() {
        System.out.println("do teacher init");
    }
    public void sayHi() {
        System.out.println("Hii Teacher");
    }
}

     此时再去用 ApplicationContext 和 Beanfactory就可以看到以下运行结果:

    在App中并没有获取 Teacher 对象,但是此时却加载了 Teacher 类的构造方法,而BeanFatory只会在 getBean() 方法调用了之后才会加载初始化 Student 对象。

  (1)所以二者的区别之一:

    在使用 ApplicationContext 时是饿汉模式,当得到一个 Spring 容器的时候就初始化了所有的 Bean 对象的,但是使用 BeanFactory 时是懒汉模式(非必要不加载),也就是只有在获取 Bean 对象的时候才会去初始化这个对象。

    这也是一个历史性的原因,在早期内存是比较昂贵的时候,是没有很大的存储空间,在一开始就初始化很多 Bean 对象的,但是随着后来的内存的价格相对不是很昂贵了,此时也就有多余的内存空间来存储很多的 Bean 对象了,尽管 Spring 是一个容器,但是底层存储的 Bean 对象本质还是在内存上存储的。

ApplicationContext的优点和缺点:   一次 Spring 容器的加载,就会初始化里面的所有 Bean 对象,后续在读取 Bean 对象读取的就会非常快; 性能较高,但是同样的也会比较耗费内存。
BeanFactory的优点和缺点:  是在getBean() 方法调用之后才会加载初始化 Bean 对象,所以性能比较低; 但是节省内存。

  (2)第二个区别:

    BeanFactory 是 ApplicationContext 的一个子类,所以ApplicationContext是后来有的,基于 BeanFactory又拓展了新的功能特性。

    按下F4键之后,我们可以看到如下图:

 

 2. 通过类型的方式获取 Bean 对象

    虽然通过名称是可以获取到 Student 对象,但是需要强转之后才能获取,因为 getBean 方法的返回值是一个Object类型的,所以用 Student 类型的去接收返回值就需要强制类型转换;所以代码看起来好像不是很优雅,此时就可以通过对象的类型来获取一个 Bean 对象。

Student student = context.getBean(Student.class);//根据类型获取

    此时的运行结果如下:

     但是这种方式获取Bean 对象也是有问题的;如果此时有两个同类型的 Bean 对象,此时再去通过类型的方式来获取Bean 对象就会报如下图的错误,因为类型一样时,程序不知道该获取哪一个对象,所以此时虽然不用强转了,但是同类型的 Bean 对象只能有一个。

 3. 通过名称 + 类型的方式获取 Bean 对象

    首先注意一个问题:如果在 Spring 容器中存储同一个对象,存储两份,此时是有两个对象呢,还是只有一个对象,另一个对象的引用指向了第一个对象呢?

(1)先在.xml 文件中存储两个相同的 Bean 对象,然后再进行验证。

 运行结果:

     也就是说首先是允许存储两个相同的 Bean 对象的,但是此时结果是false,所以是在 Spring 容器中存储了两份 Bean 对象的。(每一次存储 Bean 对象的时候,不会因为类型相同就只创建一个对象)

    根据名称 + 类型的方式来获取Bean 对象也是可以的,如下图结果:

 四、什么是DI(依赖注入)

Student student = context.getBean("student",Student.class);//根据类型获取

    上述代码就是依赖注入,就是DI,上一篇文章讲到IoC是一种思想,DI就是它的一种具体的实现方式,所以上面代码就是在程序运行的过程中动态的将 student 对象动态注入到当前运行的动态类中。

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

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

相关文章

MAYA粒子目标goalV和goalU详细应用

一下就填充到点 一个一个点填充 nParticleShape1.goalV0.5; nParticleShape1.goalU0.5; 粒子向中心移动 V方向使用渐变 删除U方向表达式 也使用渐变 使用圆角 nParticleShape1.goalUrand(0,1); nParticleShape1.goalUnParticleShape1.goalU0.02; nParticleShape1.goalUnPartic…

Excel-公式VLOOKUP 使用方法-小记

个人愚见 表示 MongoDB列中的任意一条数据 在 MySQL列 精确查找 和MongoDB列 中一模一样的数据&#xff0c;有的话返回MongoDB列数据&#xff0c;没有话返回#N/A 官方解释

redis 三种缓存更新策略

今天聊聊redis 三种缓存更新策略分别是&#xff1a; Cache Aside&#xff08;旁路缓存&#xff09;策略&#xff1b; Read/Write Through&#xff08;读穿 / 写穿&#xff09;策略&#xff1b; Write Back&#xff08;写回&#xff09;策略&#xff1b; 其中 Cache Aside策略…

php通过IP获取用户当前所在城市

php获取当前用户所在城市 php通过ip免申请api获取所在城市的代码包括省市区sql数据 <?php function getName($pinyin,$lv){$servername "localhost";$username "root";$password "root";$dbname "ttx";try {$conn new PDO(…

Blazor前后端框架Known-V1.2.4

V1.2.4 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

一款开源的Hitomi-Downloader视频下载工具,几乎支持所有主流视频网站

一款开源的Hitomi-Downloader视频下载工具&#xff0c;几乎支持所有主流视频网站 用过IDM的朋友可能知道IDM有个强大的功能就是可以嗅探网站各种视频、音频等资源&#xff0c;然后提供快捷下载&#xff0c;可不巧的是IDM是收费软件。对于不愿意付费购买IDM的朋友&#xff0c;能…

AssetBundle.Unload(true)无法卸载图集

1&#xff09;AssetBundle.Unload(true)无法卸载图集 ​2&#xff09;关于Unity 2D游戏地图预加载的问题 3&#xff09;Addressables能否支持某些资源不打Bundle直接加载源文件 这是第342篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答…

如何在CSDN博客平台上吸引铁粉

&#x1f3c6;荣誉认证&#xff1a;51CTO博客专家博主、TOP红人、明日之星&#xff1b;阿里云开发者社区专家博主、技术博主、星级博主。 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f389;欢迎关注&#x1f5…

照片文件大小怎么修改为200k?图片压缩怎么指定大小?

日常生活和工作中&#xff0c;经常用到图片&#xff0c;但是有时候需要将图片压缩指定大小来符合各种规定&#xff0c;比如图片压缩到200kb&#xff0c;那么有没有简单方便的图片压缩&#xff08; https://www.yasuotu.com/imagesize&#xff09;的方法呢&#xff1f;下面就拿压…

Centos 7 安装 Oracle 11G

Oracle 11G 安装教程 准备环境 p13390677_112040_Linux-x86-64_1of7.zipp13390677_112040_Linux-x86-64_2of7.zipCentos 7- rhel7-英文版的系统–不想换语言的执行(LANGen_US)– 传输 文件到服务器上 创建用户和组 [rootlocalhost ~]# groupadd oracle [rootlocalhost ~]…

用cmd命令刷新dns缓存

DNS flush with “ipconfig /flushdns” To flush the DNS via CMD, use the command ipconfig. To do this, enter the following command and confirm it with enter: ipconfig /flushdns After successful execution, you will receive a message that the DNS resolution…

【Go语言开发】将logrus日志送到elasticsearch构成elk体系

写在前面 这篇文章我们来讲讲怎么把logrus日志送到es。 使用的日志库是 github.com/sirupsen/logrus&#xff0c;由于这个包中的日志对象是可以接入很多个hook的&#xff0c;所以我们可以使用hook来接入 elasticsearch 来操作 。 hook 就是钩子&#xff0c;当设置hook在某个点…

第一章 SegFormer(语义分割篇)——SegFormer: 简单高效的基于Transformer的语义分割设计

0.摘要 我们提出了SegFormer&#xff0c;这是一个简单、高效且强大的语义分割框架&#xff0c;它将Transformer与轻量级多层感知机&#xff08;MLP&#xff09;解码器结合在一起。 SegFormer具有两个吸引人的特点&#xff1a; 1&#xff09;SegFormer包含一个新颖的层次结构的…

【C语言】猜数字游戏

问题描述 猜数字游戏是令游戏机随机产生一个100以内的正整数&#xff0c;用户输入一个数对其进行猜测&#xff0c;需要你编写程序自动对其与随机产生的被猜数进行比较&#xff0c;并提示大了&#xff08;“Too big”&#xff09;&#xff0c;还是小了&#xff08;“Too small”…

springboot项目target下面没有mapper.xml文件

文件结构是这个样子,mapper.xml文件在resources/mappers/fdms目录下面 通常来说, 将mapper打包到target目录下只需要在maven下面配置 <resources><resource><directory>src/main/resources</directory><filtering>true</filtering><inc…

prometheus采集服务的jmx数据,grafana通过dashboard展示jmx数据

prometheus采集服务的jmx数据&#xff0c;grafana通过dashboard展示jmx数据 一、下载prometheus二、解压prometheus三、查看prometheus目录四、查看prometheus版本五、查看prometheus的配置文件六、启动prometheus七、登陆prometheus八、查看prometheus jmx九、下载grafana十、…

嵌入式内核及驱动开发高级

一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔 不支持一些针对所有设备的统一操作&#xff08;如电源管理&#xff09; 不能自动mknod 用户查看不了设备信息 设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离…

AI实现口语练习技术解决方案

最近AI技术取得了技术上的突破&#xff0c;可以非常智能化的实现人机交互。在应用场景上很自然会想到利用AI来实现口语练习&#xff0c;下面和大家分享AI实现口语练习的AI技术方案和开发流程&#xff0c;只列出的整体思路和概略步骤&#xff0c;具体的步骤可能会根据具体的需求…

HttpClient——入门案例(发送http请求)

前言介绍 总结就是使得可以在java程序中发送http请求。 导入依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency> 发送get请求 用…

分享电商平台美食产品—味尚拉面半干面

很高兴跟您分享电商平台上一款刚推出的热门美食产品——味尚拉面 半干面。 味尚拉面 半干面&#xff0c;由厂家精心制作而成&#xff0c;是一款十分劲道爽口的拉面&#xff0c;让您在繁忙的生活中享受到美味的口感。 作为一款电商平台上备受瞩目的产品&#xff0c;味尚拉面 半干…