Java中Spring获取bean方法小结


Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?

Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制。BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用。我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文。但有时为了行文方便,我们也将ApplicationContext称为Spring容器。

对于两者的用途,我们可以进行简单划分:BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合我们都直接使用ApplicationContext而非底层的BeanFactory。

ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactory稍长一些

本文不涉及通过 @Resource 、 @Autowired 自动注入,仅仅通过 ApplicationContext 获取 Sping 配置文件中的 Bean 。

要获取XML中配置的Bean,最关键的是获取org.springframework.context.ApplicationContext

第一种获取 ApplicationContext 的方法:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("applicationContext.xml");

或者

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

这种方式实例化applicationContext是非常耗时的,这种方式适用于采用Spring框架的独立应用程序,仅仅推荐使用在程序需要通过配置文件手工初始化Spring的情况。ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件

例子:

public class BeanManager {
private static ApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml") ;
public static Object getBean(String beanId) {
return context.getBean(beanId);
}
}

在 web.xml 中写一个 servlet ,自动启动, init 方法中调用一下 BeanManager

init() throws ServletException {
BeanManager bm = new BeanManager();//可选的,为的是在 web 应用启动的时候就让 spring 加载 bean 配置。
// 否则会在第一次调用 BeanManager 的时候加载,影响一次速度。
}

在 java 代码中使用 BeanManager.getBean(String beanId); 来获得 bean 实例。

第二种获取 ApplicationContext 的方法: 通过Spring提供的工具类获取ApplicationContext对象,专为web工程定制的方法,推荐Web项目中使用。例如:

ServletContext servletContext = request.getSession().getServletContext();
ApplicationContext ac1 = WebApplicationContextUtils .getRequiredWebApplicationContext(ServletContext sc)
ApplicationContext ac2 = WebApplicationContextUtils .getWebApplicationContext(ServletContext sc)
ac1.getBean("beanId");
ac2.getBean("beanId");

通过javax.servlet.ServletContext 获取到ApplicationContext实例对象,这意味着,必须使用到request、session等等。

这样,就不能把ApplicationContext对象设置为成员变量。需要在每个具体的方法中通过request、session等获取到ServletContext再获取ApplicationContext实例。

因此,此方法仅仅推荐使用在可以获取到ServletContext对象的Web项目中,并且不需要将ApplicationContext对象定义为成员变量的情况下。

注意:当使用WebApplicationContextUtils获取ApplicationContext实例时,需要在web.xml配置文件中添加org.springframework.web.context.ContextLoaderListener监听器,否则获取不到ApplicationContext对象,返回Null。

配置文件:web.xml

<!--ContextLoaderListener自动注入 applicationContext,通过
WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext())获取 -->
<!--Spring配置文件加载位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appContext.xml,/WEB-INF/spring/appInterceptor.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3. 继承自抽象类ApplicationObjectSupport

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

4. 继承自抽象类WebApplicationObjectSupport

通过继承org.springframework.web.context.support.WebApplicationObjectSupport使用getWebApplicationContext() 获取到org.springframework.web.context.WebApplicationContext由于Web应用比一般的应用拥有更多的特性,因此WebApplicationContext扩展了ApplicationContext。WebApplicationContext定义了一个常量ROOT_WEB_APPLICATION_ CONTEXT_ATTRIBUTE,在上下文启动时,WebApplicationContext实例即以此为键放置在ServletContext的属性列表中,因此我们可以直接通过以下语句从Web容器中获取WebApplicationContext:

WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

5. 实现接口ApplicationContextAware

实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。

第三、四、五种方法都需要将类配置在 Spring 配置文件中:

<!--假定ApplicationContextTool为继承或者实现了第三、四、五种方法的具体实现类-->
<bean class="com.twovv.utils.ApplicationContextTool"></bean>

否则将获取不到 ApplicationContext ,返回 Null 。

以上内容给大家介绍了Java中Spring获取bean方法小结,希望大家喜欢。



相关阅读:
java jdbc连接mysql数据库实现增删改查操作
苹果Mac OS X系统中怎么设置滚动条始终显示?
简单了解PHP编程中数组的指针的使用
详解Android进程和线程
C#通过委托调用Button单击事件的方法
Win10自动安装游戏应用问题的解决方法
Android应用开发中模拟按下HOME键的效果(实现代码)
js实现的奥运倒计时时钟效果代码
JavaScript 对象字面量讲解
Java数组操作的10大方法
解决mysql5中文乱码问题的方法
C#删除文件夹和文件到回收站示例
子元素div高度不确定时父div高度如何自适应
删除条目时弹出的确认对话框
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 阳羡歌·山秀芙蓉 那年,你无情】 定风波·国哀 数学教学个人工作总结 关于路的句子 虎年祝福短信大全 班主任毕业鉴定范文 有趣的游戏 苏俊羽 一生恋你,只求你点缀 一次难忘的小蜜蜂文学社活动 教育局电教中心工作计划 夜里的母亲 表达想你的句子 表达爱你的句子 周五的下午 不言弃 隧道里的浓烟 童年·成长作文 最美丽的人生作文600字 爹娘是八路 梦幻天堂中飞翔的青鸟作文1300字 我听懂了小溪流的歌--读《小溪流的歌》后感 志在舍得间 她们变了作文600字 强颜欢笑的悲伤,何时的你早已消失匿迹。 2016伤口护理小组工作计划和工作总结 描写老师的好词好句(感谢篇) 快乐有理,悲伤无处 猴年中秋节祝福短信 诗三百三首 观察日记一则——含羞草600字 2016国土所个人工作总结 我们的友谊棉花糖作文200字 生活在高科技时代作文400字 蛋壳怎么变软了_关于小试验的小学生作文350字 2014最新最完整婚礼主持词 一段感情的成长 2016新春短信 高中高二作文900字:观《苦菜花》有感 我最喜欢的动物——企鹅作文700字 学校“学生学科节”活动方案 匆匆的脚步作文700字 商场工作小结 好事近(寿黄仲符) 秋天的早晨 前世今生的缘40(百变小樱的同人小说)作文1000字 我家的金鱼250字 宝葫芦的秘密读后感 600字 乡镇开展五创五争活动总结汇报 春回大地杨柳青作文100字 机会,像阳光一样跳跃_大学生励志

Copyright © 2016 phpStudy |