Spring之Bean容器初始化以及bean实例的获取

依赖注入:程序当中的一个对象依赖IOC容器将另外一个对象注入到本对象中,也就是创建各组件之间的关系

IOC容器主要用到两个包(以Spring3.2为例):

1)spring-beans-3.2.0.RELEASE.jar:主要是BeanFactory及其子类(详细内容参考;http://www.cnblogs.com/davidwang456/p/4213652.html)

2)spring-context-3.2.0.RELEASE.jar:主要是ApplicationContext及其实现类


获取Spring IOC容器代理的Bean实例的几种方式:


一、Spring中获取IOC 容器代理的Bean的实例主要依靠Bean工厂:ApplicationContext

对于ApplicationContext的解释大多如下:

ApplicationContext的中文意思是“应用上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,被推荐为Java EE应用之首选,可应用在Java APP与Java Web中。

二、开发中经常的使用的ApplicationContext的实现类如下:

类 名 
功 能 描 述
ClassPathXmlApplicationContext
从类路径ClassPath中寻找指定的XML配置文件,找到并装载
完成ApplicationContext的实例化工作。例如:
//装载单个配置文件实例化ApplicationContext容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//装载多个配置文件并实例化ApplicationContext容器
String[] configs = {" applicationContext1.xml"," applicationContext2.xml"," applicationContext3.xml"};
ApplicationContext context = new ClassPathXmlApplicationContext(configs);
在Java项目中通过ClassPathXmlApplicationContext类手动实例化ApplicationContext容器通常是不二之选
FileSystemXmlApplicationContext
从指定的文件系统路径中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。如:
//装载单个配置文件实例化ApplicationContext容器
ApplicationContext context = new FileSystemXMLApplicationContext(" applicationContext.xml");
//装载多个配置文件实例化ApplicationContext容器
String[] configs = {"c:/ applicationContext1.xml","c:/ applicationContext2.xml"};
ApplicationContext context = new FileSystemXmlApplicationContext(configs);
说明:这种方式多用于将使用Spring框架的独立的应用程序中,因为此时需要手动的指定Spring的配置文件并初始化。

XmlWebApplicationContext
从Web应用中的寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。这是为Web工程量身定制的,使用 WebApplicationContextUtils 类的 getRequiredWebApplicationContext(ServletContext servletContext) 方法或 getWebApplicationContext(ServletContext  servletContext) 方法,可在JSP与Servlet中根据 ServletContext 取得IoC容器的引用,例如:
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);//参数为ServletContext类型。
常用于B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例
而在Web项目的普通类中可以继承或实现相应的类或接口(如继承抽象类 ApplicationObjectSupport、继承 抽象类 WebApplicationObjectSupport、 实现接口 ApplicationContextAware )来获取 spring  ApplicationContext 对象:

但是在使用时一定要注意实现了这些类或接口的普通java类一定要在Spring 的配置文件application-context.xml文件中进行配置即将这些类注册到ApplicationContext(IOC容器)中。否则获取的ApplicationContext对象将为null

以上三种方式实例化ApplicationContext后都可以使用getBean()方法从ApplicationContext(IOC容器)中获得容器中的额bean实例并使用。

三、Web项目中的相关应用

我们知道对于Web项目来说ApplicationContext中包含的Bean的实例化最好能够交给Web服务器来完成。主要有涉及到两方面:

1)Spring配置文件如何加载?

2)Web服务器如何实例化ApplicationContext容器中的Bean?

对于问题1:我们可以在Spring的XML的配置文件中添加如下代码:

 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/appContext.xml</param-value> 
</context-param>

通过以上配置变可以实现在服务器启动时实例化指定的额applicationContext.xml配置文件了!

注: Spring配置文件是用于指导Spring工厂进行Bean生产、依赖关系注入(装配)及Bean实例分发的“图纸”。Java EE程序员必须学会并灵活应用这份“图纸”准确地表达自己的“生产意图”。Spring配置文件是一个或多个标准的XML文档,

ApplicationContext.xml是Spring的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。

对于问题2:Spring提供了两种方式在使得在Web项目启动时能够由Web服务器实例化ApplicationContext容器,无论哪种方式均可以在服务器启动时实例化Bean的目的

方式一:(较常用的方式)在applicationContext.xml配置文件中添加监听器ContextLoaderListener 

<listener>  
    <listener-class> org.springframework.web.context.ContextLoaderListener   </listener-class>
 </listener>
方式二: 在applicationContext.xml配置文件中添加 ContextLoaderServlet:

<servlet> 
    <servlet-name>context</servlet-name> 
    <servlet-class> 
       org.springframework.web.context.ContextLoaderServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet>

从servlet容器启动时加载组件的顺序来看,Listener组件是优先于Servlet组件的。基于Servlet方式的加载方案主要是为了兼容Servlet2.3及以下规范的Servlet容器。以Tomcat为例,Tomcat 5.x都已经支持Servlet2.4规范了,因此,基于Listener方式启动Spring容器是目前的主流选择

参考文章:1、http://baike.baidu.com/link?url=Z71Y-Uq8RHWDlSXVw9iyUBS2lIG3Hh14GdVkZ9waGGOhrl6r8CXSexs_PTN68mQM88A0CUJkQqFfzp6aFS0M8a#ref_[1]_9200243

2、http://blog.sina.com.cn/s/blog_9c7ba64d0101evar.html

3、http://blog.163.com/wangfei_sleading/blog/static/169050050201119101311349/

原文:http://m.blog.csdn.net/article/details?id=51144230

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值