spring的上下文可以同时获取两个bean对象吗

spring的上下文可以同时获取两个bean对象吗,第1张

spring的上下文可以同时获取两个bean。spring项目,在相同的上下文中创建两个springbean。需要在单独的Configuration文件和单独的访问中创建。bean对象的创建,是靠注解,想要在代码里面,不是使用注解获取到bean对象,而是在上下文对象里面获取到bean对象,项目起动,就扫描注解,让被注解的类,创建bean对象,放到spring容器里面,从容器里面获取到对象。

1添加spring获取上下文和bean方法的工具类(ApplicationContextUtil)

    @Component

    public class ApplicationContextUtil implements ApplicationContext{

        private static ApplicationContext context;

        @Override

        public void setApplicationContext(ApplicationContext context){

            ApplicationContextUtilcontext = context;

        }

        public static ApplicationContext getContext(){

            return context;

        }

    }

2在静态方法类中通过工具类获取bean内容(获取的为bean内容,也可以实例化对象,但是获取不到bean内容)

    Object obj = (Objectclass)ApplicationContextUtilgetContext()getBean("bean的名字");

spring的bean命名空间中,除了spring内部的bean,还有 自己定义的bean 。有时候,我们需要确定自己定义的bean 哪些生效 了。

使用spring的 applicationContextgetBeanDefinitionNames() ,来获取命名空间内所有的bean的name,然后根据bean的name获取 bean的class信息 ,根据 需要的bean的包路径 ,来 过滤 出自己需要的bean的信息。

需要的bean的信息,主要包括:bean的类路径,和bean的name。

其中同一个bean的类型下,有可能有多个name。如下:

定义如下工具类,可以在 非spring命名空间内 用来获取spring命名空间:

如 在spring命名空间内 ,通过如下方式 注入ApplicationContext 即可:

输出内容如下:

如果想 获取某个类,有哪些bean的实例 ,可以通过如下方法:

返回的结果,为此java类对应的bean的name,如下:

如果,java类不存在对应的bean的实例,则返回空的字符串数组

这个bean并不是你想要的。。是spring生成的一个代理哈。。

因为这个是代理。。所以还没有创建你真正想要的目标。。也就是说你想要的目标不存在。。所以我觉得没有办法哦。。

不过真正的实例是你使用它的时候创建的。。你可以在调用这个方法前先使用一下她。。比如调用一下他的方法。。

spring xml中定义

<!--spring 工具类-->

<bean id="springContextUtil" class="comskylinepubutilsSpringContextUtil"/>

SpringContextUtil的代码如下

package comskylinepubutils;

import orgspringframeworkbeansBeansException;

import orgspringframeworkcontextApplicationContext;

import orgspringframeworkcontextApplicationContextAware;

import javautilLocale;

/

Spring 获取 bean工具类

Author: skyline{>

在本文中,我们将详细介绍从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的名称和类型:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以上就是关于spring的上下文可以同时获取两个bean对象吗全部的内容,包括:spring的上下文可以同时获取两个bean对象吗、静态文件获取spring管理的bean对象、spring查看自定义的bean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9473902.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存