NO.01 如何在Spring配置文件中获取Bean

news2025/1/17 14:10:20

目录

1、前言

1.1 IOC容器在Spring中的实现

1.2 ApplicationContext的主要实现类

 2、工作准备

2.1 创建Module工程配置以来信息

2.2 创建bean所对应的类

2.3 创建Spring的配置文件,命名为applicationContext

3、从IOC容器中获取Bean

3.1 根据id获取bean

3.2 根据类型获取bean

3.2.1 扩展

3.3 根据id和类型获取bean

4、测试类完整代码


1、前言

1.1 IOC容器在Spring中的实现

Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:分别为BeanFactory和ApplicationContext。

  • BeanFactory 是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。
  • ApplicationContext是BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext。

1.2 ApplicationContext的主要实现类

  • ClassPathXmlApplicationContext:通过读取类路径下的XML格式的配置文件创建IOC容器对象
  • FileSystemXmlApplicationContext 通过文件系统路径读取 XML 格式的配置文件创建 IOC 容 器对象
  • ConfigurableApplicationContext ApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、 关闭和刷新上下文的能力。
  • WebApplicationContext 专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对 象,并将对象引入存入 ServletContext 域中。

以上四个接口的实现关系如下图所示: 

 2、工作准备

2.1 创建Module工程配置以来信息

在进行Bean的获取之前先创建一个Module工程,工程的打包方式为jar,在pom.xml文件中配置以下依赖:

<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.20</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>

2.2 创建bean所对应的类

创建HelloWorld类,之后在测试类中获取HelloWorld的Bean。HelloWorld类如下:

public class HelloWorld {
    public void SayHolleWorld(){
        System.out.println("Holle World!");
    }
}

2.3 创建Spring的配置文件,命名为applicationContext

bean的详细信息配置在bean标签中,首先配置一个bean标签配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="HelloWorldOne" class="com.review.spring.pojo.HelloWorld" ></bean>
</beans>

通过bean标签配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理, 通过bean标签配置IOC容器所管理的bean。

bean标签中的属性:

id:设置bean的唯一标识,通过id的value值获取指定的bean

class:设置bean所对应类型的全类名

3、从IOC容器中获取Bean

获取bean的方式有三种,分别为:根据id获取bean、根据类型获取bean、根据id和类型获取bean。以下演示三种获取bean的方式。

3.1 根据id获取bean

由于bean标签中的 id 属性指定了 bean 的唯一标识,所以根据 bean 标签的 id 属性可以精确获取到一个组件对象。

以下是获取bean的演示:

    @Test
    public void getBeanById() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=(HelloWorld)ioc.getBean("HelloWorldOne");
        helloWorld.SayHolleWorld();
    }

3.2 根据类型获取bean

根据id获取容器需要进行类型转换,因此可以类型获取bean,从而省去类型转换的工作。

    @Test
    public void getBeanByType() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=ioc.getBean(HelloWorld.class);
        helloWorld.SayHolleWorld();
    }

 值得注意的是,当根据类型获取bean时,要求IOC容器中指定类型的bean有且只能有一个,当IOC容器中一共配置了两个bean时,如下

    <bean id="HelloWorldOne" class="com.review.spring.pojo.HelloWorld" ></bean>
    <bean id="HelloWorldTwo" class="com.review.spring.pojo.HelloWorld"></bean>

再根据类型获取bean时会抛出异常。

3.2.1 扩展

如果组件类实现了接口,可以根据接口类型获取 bean ,前提是bean唯一;如果一个接口有多个实现类,这些实现类都配置了bean,就不可以根据接口类型获取 bean。因此根据类型来获取bean时,在满足bean唯一性的前提下,看:『对象 instanceof 指定的类型』的返回结果,只要返回的是true就可以认定为和类型匹配,能够获取到。

3.3 根据id和类型获取bean

根据id获取bean需要进行类型转换,根据类型获取bean要求Spring配置文件中一个类只能有一个bean。而根据id和类型获取bean可以解决以上两种方式的缺点。

    @Test
    public void getBeanByIdAndType() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=ioc.getBean("HelloWorldTwo",HelloWorld.class);
        helloWorld.SayHolleWorld();
    }

4、测试类完整代码

public class HelloWorldTest {

    @Test
    public void getBeanById() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=(HelloWorld)ioc.getBean("HelloWorldOne");
        helloWorld.SayHolleWorld();
    }
    @Test
    public void getBeanByType() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=ioc.getBean(HelloWorld.class);
        helloWorld.SayHolleWorld();
    }
    @Test
    public void getBeanByIdAndType() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=ioc.getBean("HelloWorldTwo",HelloWorld.class);
        helloWorld.SayHolleWorld();
    }
}

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

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

相关文章

由JDK bug引发的线上OOM

由JDK bug引发的线上OOM 最近生产环境的一个应用忽然发生了OOM&#xff0c;还好是业务低峰期&#xff0c;没有导致什么严重问题&#xff0c;下面记录下本次排查的过程&#xff1b; 故障临时处理 在某天下午&#xff0c;正在愉快的写代码时&#xff0c;忽然看到业务反馈支付服…

嵌入式Linux人脸检测libfacedetection

人脸检测 此库依赖Opencv&#xff0c;所以首先要移植Opencv到板子上。 笔者使用LVGL搭建了一个界面&#xff0c;界面有些卡顿&#xff08;主要原因是文件存取较慢&#xff09;&#xff0c;演示效果如下&#xff1a; OpenCV 首先要交叉编译Opencv 参考&#xff1a;https://…

燃气管网监测系统,24小时守护燃气安全

随着社会的发展和人民生活水平的提高&#xff0c;燃气逐渐成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;近年来&#xff0c;屡屡发生的燃气爆炸问题&#xff0c;也让人们不禁对燃气的安全性产生了担忧。因此&#xff0c;建立一个高效、实时、准确的燃气管网监测…

光谱响应函数概念与等效遥感反射率的计算

本期干货来介绍一下遥感领域非常重要的一个概念——光谱响应函数。 人眼内部存在三种视锥细胞&#xff08;L、M、S&#xff09;&#xff0c;对不同波段的光有不同的敏感度&#xff0c;三种视锥细胞信号的复合构成了我们眼中五彩斑斓的世界。如下图所示&#xff0c;以菠菜&#…

抖音短视频seo矩阵系统源代码技术开发方案分享

一、 功能结构设计 1. 视频管理&#xff1a;对于不同平台&#xff0c;不同账号&#xff0c;不同格式&#xff0c;不同内容短视频进行管理&#xff0c;素材分组等&#xff0c;实现多资源数据汇和统一管理 2. 数据挖掘分析&#xff1a;通过数据挖掘和数据分析&#xff0c;提供数…

leetcode 17.电话号码字母组合

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/ 代码&#xff1a; class Solution { public:const char * letterCombine(int i) {static const char *letter[] { "" , …

Nexus3下载使用

下载 Nexus 3 1. 进入 Nexus 3.x 下载页面&#xff08;目前最新版是 3.59.0-01&#xff09;&#xff0c;根据操作选择相应的版本进行下载。 2. 将下载的安装包解压到本地&#xff0c;可获得 nexus-3.59.0-01 和 sonatype-work 两个目录 其中&#xff1a; nexus-3.59.0-01&…

PE输入表DLL注入

PE输入表DLL注入 一.实现效果 启动notepad.exe时能够加载自己编写的dll. 最终效果如图所示 下面逐步讲解并附带源码 二.编写DLL 自行编写DLL,导出一个函数,弹出对话框 // MsgDLL66.cpp : Defines the entry point for the DLL application. //#include "stdafx.h"…

Zoho CRM有哪些优势?

CRM能帮助企业管理客户信息、跟进销售机会、提高客户转化&#xff0c;显著提升企业的竞争力&#xff0c;是企业发展的重要工具。市场上有很多CRM品牌&#xff0c;企业该如何选型&#xff1f;这里给大家分享一个不错的CRM品牌 Zoho CRM有哪些优势&#xff1f; 功能全面&#x…

jQuery-使用、选择器、属性、样式、文档、循环等操作

jQuery jQuery简介 jQuery是一个快速、简洁的JavaScript框架&#xff0c;是继Prototype之后又一个优秀的JavaScript代码库&#xff08;框架&#xff09;于2006年1月由[John Resig](https://baike.baidu.com/item/John Resig/6336344?fromModulelemma_inlink)发布。jQuery设计…

Docker安装ES+kibana8.9.1

参考&#xff1a;基于Docker安装Elasticsearch【保姆级教程、内含图解】_docker elasticsearch_Acloasia的博客-CSDN博客 创建网络 docker network create es-net 基于Docker安装Elasticsearch 拉取镜像 docker pull elasticsearch:8.9.1 挂载文件 mkdir -p /usr/local/e…

vue使用vant中的popup层,在popup层中加搜索功能后,input框获取焦点 ios机型的软键盘不会将popup顶起来的问题

1.使用vant的popup弹出层做了一个piker的选择器,用户需要在此基础上增加筛选功能。也就是输入框 2.可是在ios机型中,input框在获取焦点以后,ios的软键盘弹起会遮盖住我们的popup层,导致体验不是很好 3.在大佬的解答及帮助下,采用窗口滚动的方式解决此方法 <Popupv-model&q…

NGINX的速率限制(限流)

NGINX 的速率限制&#xff08;限流&#xff09; NGINX最有用但经常被误解和配置错误的功能之一是限流。它允许您限制用户在给定时间段内可以发出的HTTP请求量。 限流可以用于安全目的&#xff0c;例如减慢暴力破解密码的攻击。它可以通过限制请求速率为真实用户的典型值来帮助…

双目色彩一致性问题定位回顾

双目色彩一致性问题定位回顾 一、事情起因&#xff1a; 客户想要用一个主控搭载两颗相同的sensor&#xff0c;使用相同的镜头进行双目拼接以扩大视场角&#xff0c;达到类似广角镜头的效果&#xff1a; 双目采集的原始图像&#xff1a;图片来源&#xff1a;宇视全彩双目广角筒…

Python“牵手”速卖通商品列表数据,关键词搜索速卖通API接口数据,速卖通API接口申请指南

速卖通平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;速卖通API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问速卖通平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现速…

基于NXP i.MX 6ULL核心板的物联网模块开发案例(2)

目录 2 NB-IoT模块测试 2.1 获取IMEI和IMSI 2.2 创建云端NB-IoT设备 2.3 创建通信套件实例 2.3.1 生成配置参数 2.3.2 创建实例 前言 本文主要介绍基于创龙科技TLIMX6U-EVM评估板的物联网模块开发案例&#xff0c;适用开发环境&#xff1a; Windows开发环境&#xff1a;…

Docker 安装rabbitmq:3.12-management

拉取镜像&#xff1a; docker pull rabbitmq:3.12-management mkdir -p /usr/local/rabbitmq chmod 777 /usr/local/rabbitmq docker run -id --restartalways --namerabbitmq -v /usr/local/rabbitmq:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_U…

助力品牌形象建设,FairGuard支持企业深度定制化

2022年&#xff0c;中国游戏市场实际销售收入与游戏用户规模出现近年来的首次下降&#xff0c;标志着游戏产业发展正式迈入存量时代。 存量市场时代&#xff0c;意味着游戏产品获取用户的难度逐渐加大&#xff0c;对于游戏的内容品质、技术实力和价值拓展等有了更高的要求。如…

恒运资本:什么是股票分红和基金分红?两者有什么区别?

出资者在进行股票出资和基金出资的时分&#xff0c;能够参与股票分红或许基金分红&#xff0c;可是许多新手对分红不是很了解。那么什么是股票分红和基金分红&#xff1f;两者有什么区别&#xff1f;下面就由恒运资本为大家分析&#xff1a; 什么是股票分红和基金分红&#xff…

C语言实例_实现malloc与free函数完成内存管理

一、malloc和free函数介绍 在C语言中&#xff0c;malloc和free是用于动态内存管理的函数。 &#xff08;1&#xff09;malloc函数 malloc函数用于在堆&#xff08;heap&#xff09;中分配指定大小的内存空间&#xff0c;并返回一个指向该内存块的指针。 原型如下&#xff1a…