一 什么是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()等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)