理解Spring中的getBean()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解Spring中的getBean()相关的知识,希望对你有一定的参考价值。

参考技术A

在本文中,我们将详细介绍从BeanFactory中获取bean的多种方式。

简单地说,正如方法的名称所表达的, getBean() 负责从Spring IOC容器中获取bean实例。

首先,让我们定义一些用于测试的Spring bean。创建spring IOC容器有多种方式,但是在本文中,我们将使用基于注释的Java配置:

我们创建了两个bean。 Lion 具有默认的单例作用域。Tiger被显式地设置为 prototype 。另外,我们为每个bean定义了名称,这些名称将在后边的实例中使用。

BeanFactory提供了getBean()方法的5个方法,我们将在下面的小节中研究。

让我们看看如何使用名称获取 Lion Bean实例:

在此方法中,我们根据bean名称获取bean,如果在spring ico容器中存在和bean,则返回 Object 类的实例。否则,抛出如下异常NoSuchBeanDefinitionException。

主要的缺点是,在获取bean之后,我们必须将它转换为所需的类型。如果返回的bean的类型与我们期望的不同,则可能会产生异常。

假设我们试图用“tiger”这个名字来得到“lion”。当我们将结果转换为lion时,它会抛出一个ClassCastException:

在这里,我们需要指定所请求bean的名称和类型:

与3.1的方法相比,此方法更安全,因为我们可以编译阶段就发现错误而不是在运行阶段。

使用 getBean() 的第三种方式, 仅指定bean类型就足够了

在这种情况下,我们需要 特别注意可能存在的歧义

在上面的示例中,由于 Lion Tiger都 实现了 Animal 接口,因此仅指定类型不足以明确确定结果。因此,我们得到一个 NoUniqueBeanDefinitionException 。即在同一个IOC 容器中,如果有相同类型的多个bean,则不能通过类型获取bean。

除了bean名称,我们还可以传递构造函数参数:

这个方法有点不同,因为它只适用于具有原型作用域的bean。

在单例的情况下,我们将得到BeanDefinitionStoreException异常。

因为原型bean,每次从spring ioc容器中获取bean都会返回一个新创建的实例,所以我们可以在调用getBean()时动态地提供构造函数参数:

正如我们所看到的,根据我们在请求bean时指定的第二个参数,每个Tiger都有不同的名称。

此方法类似于上一个方法,但是我们需要将类型而不是名称作为第一个参数传递:

与3.4相似, 此方法仅适用于具有原型作用域的bean

getBean()尽管是在BeanFactory接口中定义的,但是getBean()方法大部分是通过ApplicationContext访问。通常,我们在应用程序中不希望直接使用getBean()方法。

Bean应该由容器管理。如果我们想使用它们中的一个,我们应该依赖依赖注入,而不是直接调用ApplicationContext.getBean()。这样,我们就可以避免将应用程序逻辑与与框架相关的细节混合在一起。

在本快速教程中,我们从 BeanFactory 接口浏览了 getBean() 方法的所有实现,并描述了每种方法的优缺点。

Spring中的@scope注解

scope,中文翻译是作用域。

然后这尴尬的是默认是单例?让我觉得他是一个设计模式什么的,,,

其实scope理解起来,反而像什么时候创建一次实例那样。

 

参数解析

singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例

prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例

request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效

session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效

globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效。

以上是关于理解Spring中的getBean()的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记——Spring简介;Spring搭建步骤;Spring的特性;Spring中getBean三种方式;Spring中的标签

Spring -- Spring相关API (ApplicationContext getBean)

简单易懂getBean(id)和getBean(Class)使用的区别

简单易懂getBean(id)和getBean(Class)使用的区别

Spring中的@scope注解

关于spring的源码的理解