分享

剖析Spring容器的作用及实现方式 - 田野 - JavaEye技术网站

 向日葵kk 2010-12-04
我们在使用ssh整合项目的时候,Spring在其中是一个非常重要的框架,它在其中可以说是一个最核心的框架,提到spring我们不得不提它的IOC 容器的功能了!它是一个大工厂,可以在其中产生和管理很多的bean,下面,请随阿堂一起来好好看看spring的容器功能方面的介绍,这对于我们在解决 ssh框架整合中的问题,进行测试时是非常有用的!

1.spring容器
     Spring有两个核心接口BeanFactory和ApplicationContext,其中ApplicationContext是 BeanFactory的子接口,它们代表了Spring容器,Spring容器是产生Bean的工厂,用于管理容器中的Bean。Bean是 Spring管理的基本单位,在spring的J2EE应用中,所有的组件都是Bean。Bean包括数据源、Hibernate的 SessionFactory、事务管理器等。

     应用中的所有组件,都处于spring的管理下,都被spring以Bean的方式管理,spring负责创建Bean实例,并管理其生命周期。 Spring里的Bean是非常广义的概念,任何Java对象和Java组件都被当成Bean处理,甚至这些组件,并不是标准的JAVABEAN。
     Bean在spring容器中运行,无须感受Spring容器的存在,一样可以接受spring的信赖注入,包括Bean属性的注入、合作者的注入、信赖关系的注入等。
spring容器负责创建Bean实例,所以需要知道每个Bean的实现类,JAVA程序的实现面向接口编程,无须关心Bean实例的实现。但Spring容器必须能精确知道每个Bean的实现类,因此Spring配置文件必须精确配置Bean的实现类。



    Spring容器最基本的接口就是BeanFactory. BeanFactory负责配置、创建、管理Bean,它有一个子接口ApplicationContext,因此也称为Spring上下文。 Spring容器负责管理Bean与Bean之间的信赖关系。

BeanFactory接口包含如下基本的方法:
public boolean containsBean(String name),判断Spring容器是否包含id为name的Bean定义
public Object getBean(String name)返回容器id为name的bean
public Object getBean(String name,Class requiredType)返回容器中id为name,并且类型为requiredType的Bean
public Class getType(String name)返回容器中id为name的Bean的类型

    调用者只需使用getBean方法即可获得指定Bean的引用,无须关心Bean的实例化过程,即Bean实例的创建过程完全透明。

    BeanFactory有很多实现类,通常使用 org.springframework.beans.factory.xml.XmlBeanFactory类。但对于大部分J2EE应用而言,推荐使 用ApplicationContext. ApplicationContext是BeanFactory的子接口,其常用实现类是

org.springframework.context.support.FileSystemXmlApplicationContext和

org.springframework.context.support.ClassXmlAplicationContext.

     创建 BeanFactory实例时,必须提供Spring容器管理的Bean的详细配置信息。 Springr的配置信息通常采用XML配置文件来设置,因此,创建BeanFactory实例时,应该提供XML配置文件作为参数。 XML配置文件通常使用Resource对象传入



Resource接口用于访问配置文件资源
     大部分j2ee应用,可在启动web应用时自动加载ApplicationContext实例,接受Spring管理的Bean无须知道ApplicationContext的存在,一样可以利用ApplicationContext的管理。

对于独立的应用程序,也可以通过如下方法来实例化BeanFactory



//搜索当前文件路径下的beans.xml文件创建Resource对象
InputStreamResource isr=new FileSystemResource(is);
//以Resource对象作为参数,创建BeanFactory的实例
XmlBeanFactory factory=new XmlBeanFactory(isr);



或者采用如下方法


//搜索CLASSPATH路径,以CLASSPATH路径下的beans.xml文件创建Resource对象
ClassPathResource res=new ClassPathResource("beans.xml");
//以Resource 对象作为参数,创建BeanFactory实例
XmlBeanFactory factory=new XmlBeanFactory(res);



     如果应用里有多个属性配置文件,则应该采用BeanFactory的子接口ApplicationContext来创建BeanFactory的实例,ApplicationContext通常采用如下两个实现类。

FileSystemXmlApplicationContext ,以指定路径的XML配置文件创建ApplicationContext
ClassPathXmlApplicationContext,以CLASSPATH路径下的XML配置文件创建ApplicationContext



如果需要同时加载多个XML配置文件,可以采用如下方式

//搜索CLASSPATH路径,以CLASSPATH路径下的applicationContext.xml 和 service.xml文件创建ApplicationContext
ClassPathXmlApplicationContext appContext=new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml","service.xml"});

//事实上,ApplicationContext是BeanFactory的子接口,支持强制类型转换
BeanFactory factory=(BeanFactory) appContext;



当然,也可以支持从指定的路径来搜索特定文件加载:


//以指定路径下的applicationContext.xml和service.xml文件创建 Applicationcontext
FileSystemXmlAplicationContext appContext=new
FileSystemXmlApolicationContext(
new String[] {"applicationContext.xml","service.xml"}
)
//事实上,ApplicationContext是BeanFactory的子接口,支持强制类型转换
BeanFactory factory=(BeanFactory) appContext;


2.使用ApplicationContext
    很多时候,并不是直接使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例。因此,有时候也称 Spring容器为Spring上下文。 ApplicationContext是BeanFactory接口的子接口,它增强了BeanFactory的功能。
    ApplicationContext允许以声明方式操作容器,无须手动创建它。可利用如ContextLoader的支持类,在web应用启动自动创建ApplicationContext。当然,也可以采用编程方式创建ApplicationContext



ApplicationContext继承MessageSource接口,因此提供国际化支持资源访问,比如 URL和文件
事件传递
载入多个配置文件
    ApplicationContext包括  BeanFactory的全部功能,因此建议优先使用ApplicationContext ,除了对于某些内存非常关键的作用,才考虑使用BeanFactory

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多