Java中如何获取Spring中配置的bean

Java中如何获取Spring中配置的bean,第1张

一 什么是Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架

二 如何在程序中获取Spring配置的bean呢

方法一 在初始化时保存ApplicationContext对象

代码

ApplicationContext ac = new FileSystemXmlApplicationContex( applicationContext xml );     ac getBean( beanId );

ApplicationContext ac = new FileSystemXmlApplicationContex( applicationContext xml );

ac getBean( beanId );说明 这种方式适用于采用Spring框架的独立应用程序 需要程序通过配置文件手工初始化Spring的情况

方法二 通过Spring提供的工具类获取ApplicationContext对象

代码

import sprntext support WebApplicationContextUtils;      ApplicationContext ac = WebApplicationContextUtils                                 getRequiredWebApplicationContext(ServletContext sc)      ApplicationContext ac = WebApplicationContextUtils                                 getWebApplicationContext(ServletContext sc)      ac getBean( beanId );      ac getBean( beanId );   import sprntext support WebApplicationContextUtils;      ApplicationContext ac = WebApplicationContextUtils                                 getRequiredWebApplicationContext(ServletContext sc)      ApplicationContext ac = WebApplicationContextUtils                                 getWebApplicationContext(ServletContext sc)      ac getBean( beanId );      ac getBean( beanId );

方法三 继承自抽象类ApplicationObjectSupport

说明 抽象类ApplicationObjectSupport提供getApplicationContext()方法 可以方便的获取到ApplicationContext Spring初始化时 会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入

方法四 继承自抽象类WebApplicationObjectSupport

说明 类似方法三 调用getWebApplicationContext()获取WebApplicationContext

方法五 实现接口ApplicationContextAware

lishixinzhi/Article/program/Java/ky/201311/28587

getBean是用来获取applicationContextxml文件里bean的,()写的是bean的id。

一种是singleton,一种是prototype,默认的是singleton,这种定义的bean实例的作用是与spring的容器一致的,只有spring容器初始化,调用getBean得到的singleton实例始终是同一个bean的实例spring定义的bean有两种作用范围,是每当调用getBean得到实例的时候spring都会new一个实例来给你,而prototype的实例。

在本文中,我们将详细介绍从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() 方法的所有实现,并描述了每种方法的优缺点。

这篇文章只针对后台返回的数据, 本地数据除外

我们发送网络请求的时候, 带一个语言类型参数, 例如 mapput("language", "ZH"), 我们需要什么语言就传什么语言类型, 正常接收返回值就可以了

这样做的好处:

对于android端, 新增、修改、删除语言 时也只需改变一个字段的值即可, 这个字段可以使用接口来控制值, App完全可以不用任何修改, 灵活性较高

对于整个项目而言: 前端("android", "IOS", "小程序", "公众号") 等多个端, 完全无需做任何判断, 只需后台处理好即可, 总体可以节约不少时间

后台把所有的语言数据一起返回 , 可能出现如下格式:

同行的人看到了肯定会说: 叫后台改成第一种方式啊

如果是项目刚刚开始开发, 可能比较好改

我碰到的情况是: 一开始项目没有做android端, 后台和web端已经上线了不知道多少个版本了, 反正就是后台架构已经确定了, 这个时候改成本会比较大 只能自己处理了

这个时候处理方式:

① 如果按照原来的方式: GsonFormat如下图:

这样是可以解析出来的, 看起来项目也能正常运行, 但是每个接口都这么做的话, 维护起来难度太大了, 项目越大越难维护 , 例如:新增一种语言, 竟然要全局大改 有100个接口就要改100个实体类, 等等

② 特殊处理

思考: 有什么办法可以和第一种方式一样, 修改一个参数就可以全局改变语言

观察: 共同点: 多语言的实体类里面都会有 变量名为"ZH" "EN" 的对象 , 对象不确定类型, 这个时候想到用泛型 于是有下面的写法:

我们的实体类都有这个特性, 所以直接继承即可

解析

解析数据类型2

特殊处理步骤:

① 封装好多语言基类LanguageBean<T>

② 多语言实体类继承LanguageBean<T>

③ 获取多语言实体数据时, 要用beanget()获取对象

好处

① 增删改语言, 只需在基类LanguageBean<T>修改即可, 其它地方完全不需要修改

② 切换语言时: 只需赋值给languageType即可

③可切换回方式1 (网络请求的时候, 带一个语言类型参数) , 只需languageType = "" 即可

封装好以后, 即使后台要重构, 使用方式1处理多语言, 我们也只需修改一个字段即可

以上就是关于Java中如何获取Spring中配置的bean全部的内容,包括:Java中如何获取Spring中配置的bean、关于spring的getBean方法、理解Spring中的getBean()等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/web/9823186.html

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

发表评论

登录后才能评论

评论列表(0条)

保存