spring框架ApplicationContext的getBean()方法的详解

article/2025/10/26 0:47:56

点击上方蓝字"优派编程"选择“加为星标”,第一时间关注原创干货

spring框架:接口ApplicationContext中的getBean()方法的详解

http://wp.fang1688.cn/study/318.html

我们知道可以通过ApplicationContext的getBean方法来获取Spring容器中已初始化的bean。getBean一共有以下四种方法原型:
1,l getBean(String name)
2,l getBean(Class<T> type)
3,l getBean(String name,Class<T> type)
4,l getBean(String name,Object[] args)

下来我们分别来探讨以上四种方式获取bean的区别。
其中实体类Person定义如下:

public class Person {private String name;
private int age;
public Person(){}public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}public int getAge() {
return age;
}public void setAge(int age) {
this.age = age;
}@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}

applicationContext.xml注册有id为p的bean,配置如下:

<bean id="p" class="com.bean.Person"><property name="name" value="张三"/><property name="age" value="18"/></bean>

第一种:l getBean(String name)
参数name表示IOC容器中已经实例化的bean的id或者name,且无论是id还是name都要求在IOC容器中是唯一的不能重名。那么这种方法就是通过id或name去查找获取bean.获取bean的参考代码如下:

@Test
public void testPerson()
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");Person p = (Person) ctx.getBean("p");System.out.println(p);
}

第二种:l getBean(Class<T> type)
参数Class<T> type表示要加载的Bean的类型。如果该类型没有继承任何父类(Object类除外)和实现接口的话,那么要求该类型的bean在IOC容器中也必须是唯一的。比如applicationContext.xml配置两个类型完全一致的bean,且都没有配置id和name属性。

<bean class="com.bean.Person"><property name="name" value="张三"/><property name="age" value="18"/></bean><bean class="com.bean.Person"><property name="name" value="李四"/><property name="age" value="20"/></bean>

那么通过com.bean.Person这种类型来查找bean,参考代码如下:

@Test
public void testPerson(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");Person p = ctx.getBean(Person.class);System.out.println(p);
}

但是由于属于com.bean.Person的bean在IOC容器中不唯一,所以这里会抛出NoUniqueBeanDefinitionException异常。
由此我们可以总结getBean(String name)和getBean(Class<T> type)的异同点。
相同点:都要求id或者name或者类型在容器中的唯一性。
不同点:getBean(String name)获得的对象需要类型转换而getBean(Class<T> type)获得的对象无需类型转换。

第三种:l getBean(String name,Class<T> type)

这种方式比较适合当类型不唯一时,再通过id或者name来获取bean。
例如applicationContext.xml配置有如下bean:

<bean id="p1" class="com.bean.Person"><property name="name" value="张三"/><property name="age" value="18"/></bean><bean name="p2" class="com.bean.Person"><property name="name" value="李四"/><property name="age" value="20"/></bean>

参考代码如下:

@Test
public void testPerson()
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");Person p = ctx.getBean("p2",Person.class);System.out.println(p);
}

这样可以获取到名字叫”李四”的对象。

第四种:l getBean(String name,Object[] args)
这种方式本质还是通过bean的id或者name来获取bean,通过第二个参数Object[] args可以给bean的属性赋值,赋值的方式有两种:构造方法和工厂方法。但是通过这种方式获取的bean必须把scope属性设置为prototype,也就是非单例模式。
先在com.factory包下设计有如下的工厂类:

public class PersonFactory {
//静态工厂注入
public static Person getPersonInstance(String name,int age)throws Exception
{Person p = (Person)Class.forName("com.bean.Person").newInstance();Method m = p.getClass().getMethod("setName", java.lang.String.class);m.invoke(p, name);m = p.getClass().getMethod("setAge", int.class);m.invoke(p, age);return p;
}
}

在applicationContext.xml中配置有如下bean:

<bean name=”p3″ class=”com.bean.Person” scope=”prototype”/>

获取bean的参考代码如下:

@Testpublic void testPerson(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");Person p = (Person) ctx.getBean("p3",new Object[]{"王五",35});System.out.println(p);
}

如果想通过工厂注入属性,在applicationContext.xml配置如下bean:

<bean name="p3" class="com.factory.PersonFactory" factory-method="getPersonInstance" scope="prototype">
<constructor-arg name="name"><null/></constructor-arg><constructor-arg name="age" value="0"/></bean>

最近小编方包新开了一个小程序商城店铺!不买点去看看也好,为我的小店铺涨涨流量也好!谢谢了!

我的【知识学堂小店】,点击下方小程序链接进入商城即可!

知识学堂小店(点击此处跳转)

a789594795e3a3b8f06e1d869ac81f3a.png


送福利!关注下方的公众号:“优派编程”,搜索关键词“资料”,即可获得软件app下载资源和python、java等编程学习资料!

   6aaaeaf049824ded2c5a001caad288c5.png

点击左下方“阅读原文”关注方包it博客:

https://www.fang1688.cn

领取更多福利!


http://chatgpt.dhexx.cn/article/Ck4uhh23.shtml

相关文章

【细读Spring Boot源码】Spring如何获取一个Bean?BeanFactory的getBean方法

前言 在读refresh(context);时&#xff0c;finishBeanFactoryInitialization(beanFactory);中beanFactory.preInstantiateSingletons();用于实例化剩余所有的non-lazy-init的单例。这里包含了前置处理器和后置处理器 这里面就用到了本文主题getBean(beanName); 下面具体看看这…

Spring中关于getBean()报强制转化错误

在自学Spring时&#xff0c;在使用getBean()时&#xff0c;会报com.sakura.dao.impl.BookDaoImpl cannot be cast to com.sakura.dao.BookDao at com.sakura.App2.main(App2.java:19) 这个错误表示&#xff0c;不能将一个实现类BookDaoImpl类强转为BookDao接口。这个错&#…

spring源码解读之getBean方法(一)

前言 大家使用spring&#xff0c;最常接触到的就是bean&#xff0c;大家也知道spring中用一句getBean就能取出一个实例化好的bean&#xff0c;这个bean是属于IOC容器管理的&#xff0c;那么大家有没有看过getBean方法的源码呢&#xff0c;知不知道spring容器到底是怎么得到一个…

Spring源码之getBean(获取 bean)方法(一)解读

目录 测试类一个简单的测试类对于 ApplicationContext 和 ClassPathXmlApplicationContext 类图如下getBean() 源码解读查看 AbstractApplicationContext 中的 getBean 方法查看 AbstractBeanFactory 的 doGetBean 方法看 doGetBean 方法的流程图分析doGetBean 方法的主要流程 …

JavaBean(set和get方法)

JavaBean的规范 类中所有的成员属性都是私有&#xff0c;也就是 private 来修饰 提供一个公共无参数的构造方法 为所有私有的属性提供公共的 set 和 get 方法。 set方法 set 方法是有参数无返回值的&#xff0c;目的是通过 set 方法给 javabean 中的私有属性赋值&#xff0c;…

getBean方法源码

一、 三个API // 根据name获取bean Override public Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false); }// 根据name获取bean&#xff0c;如果获取到的bean和指定类型不匹配&#xff0c;则抛出异常 Override public <T>…

详解Spring中getBean()方法

我们日常会经常使用getBean()方法从spring容器中获取我们需要的bean。那么&#xff0c;getBean()方法是怎么一步步完成从spring容器中获取bean的呢&#xff1f; 下面我们就通过源码分析一下。 一、主要代码分析 基于&#xff1a;spring5.1 入口&#xff1a;AbstractBeanFactory…

getBean方法(一)

我们先看看这个方法的轮廓流程 这个getbean的轮廓方法很长. 先分两种情况: 一种是在缓存实例中能拿到bean, (主要是factroyBean的处理, 执行所有已注册的 BeanPostProcessor 的 postProcessAfterInitialization 方法) 前边是校验 (如果name以“&”为前缀&#xff0c;但是b…

Spring源码分析之getBean主流程分析

当我们通过向Spring容器获取某个bean的时候&#xff0c;总是调用Spring中重载的各种getBean方法。那么&#xff0c;getBean中的流程是什么样的&#xff1f; 通过本文&#xff0c;你将对getBean方法的主流程有一个详细的认识。 入口当然是getBean方法&#xff1a; public Obje…

getBean( )流程

getBean() 方法是顶层接口 BeanFactory 提供的&#xff0c;一共五个原型。AbstractBeanFactory作为抽象实现&#xff0c;复写了其中3个方法&#xff0c; Overridepublic Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);}Overr…

Prometheus监控MongoDB数据库

监控环境&#xff1a;Prometheus 数据库&#xff1a;MongoDB 3.4.6 集群&#xff0c;3个节点 监控工具&#xff1a;mongodb_exporter 我这个模板是自己二次开发的。使用mongodb_exporter 监控 阿里云的MongoDB数据库 各位根据自己的需求进行使用 1、创建Mongodb监控可读账…

DBeaver 数据库管理工具

DBeaver 数据库管理工具 DBeaver 是一个基于 Java 开发&#xff0c;免费开源的通用数据库管理和开发工具&#xff0c;使用非常友好&#xff0c;且遵循ASL 协议。由于 DBeaver 基于 Java 开发&#xff0c;可以运行在各种操作系统上&#xff0c;比如Windows、Linux、macOS 等操作…

mysql数据库监控

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系数据…

一些数据库监控,优化,管理工具

http://www.itpub.net/viewthread.php?tid1057814&extra&page1 一些数据库监控,优化,管理工具 ******************************************************************* 这两天网盘连不上了&#xff0c;导致国内用户暂时无法下载。大家下载时需要用代理。这里提供一个比…

oracle实时监控工具

oracle实时监控工具市面上不多&#xff0c;但是兼具数据维护管理及性能实时监控的工具可以说更少&#xff0c;而实时监控又是项目运维管理&#xff0c;测试&#xff0c;开发但环节不可少的功能&#xff0c;目前有一款JAVA开发的&#xff0c;基于WEB的&#xff1a;TreeSoft数据库…

数据库的可用监控

监控 数据库是否连接和读写以及数据库的连接数 1、确认数据库是否可以通过网络连接 造成连接不成功的原因&#xff1a;防火墙 TCP/IP连接被占满 监控的方式&#xff1a; 1、mysqladmin -u 监控用户 -p 密码 -h 监控的服务器地址 ping 首先我们在MySQL下要建立一个mysql 的用户…

数据库实时监控,实时监控数据库数据

为了满足大多数用户对数据库的监控和运维需求&#xff0c;系统实时采集了监控数据库的主要指标&#xff0c;并提供完整的报警、性能容量分析和报告功能。  系统以数字形式收集现场设备发送的数据&#xff0c;通过实时数据操作实现监控功能&#xff0c;并提供有利于监控生产过…

数据库监控工具SQL Monitor:可同时实现云和本地的SQL Server数据库监视

SQL Monitor提供了一个基于Web的监视&#xff0c;在桌面计算机和移动设备上实时地监控服务器的性能。使用SQL Monitor时&#xff0c;只要一出现问题&#xff0c;你将会通过邮件和用户界面接收到警告&#xff0c;SQL Monitor会快速地做全局检查&#xff0c;检查单机&#xff0c;…

mysql实时监控工具

mysql实时监控工具市面上有许多了&#xff0c;但是兼具数据维护管理及性能实时监控的工具不多&#xff0c;可以说很少&#xff0c;而实时监控又是项目运维管理&#xff0c;测试&#xff0c;开发但环节不可少的功能&#xff0c;目前有一款JAVA开发的&#xff0c;基于WEB的&#…

数据库监控

数据库监控 一、数据库监控介绍 1、对什么进行监控 (1) 对数据库服务可用性进行监控 数据库进程或是端口存在并不意味着数据库就是可用的&#xff1b; 通过网络连接到数据库并且确定数据库是可以对外提供服务的。 (2) 对数据库性能进行监控 QPS和TPS&#xff1b; 并发线程数量…