Spring提供的Spring BeanFactory容器和ApplicationContext容器

Spring BeanFactory容器:最简单的容器,给DI提供基本的支持, 它用 org.springframework.beans.factory.BeanFactory 接口来定义。BeanFactory 或者相关的接口,如 BeanFactoryAware,InitializingBean,DisposableBean,在 Spring 中仍然存在具有大量的与 Spring 整合的第三方框架的反向兼容性的目的。
Spring容器最基本的接口就是BeanFactory.BeanFactory负责配置,创建,管理Bean,他有一个子接口:applicationContext,因此也被称为Spring上下文.Spring容器还负责管理Bean于Bean之间的依赖关系.
BeanFactory接口包含如下几个基本方法:
1.Boolean containBean(Stirng name):判断Spring容器是否包含id为name的Bean的实例
2.<T>getBean(Class<T> requiredType):获取Spring容器中属于requiredType类型的,唯一的Bean实例.
Object getBean(String name):返回容器id为name的Bean实例
3.<T> T getBean(String name,Class requiredType):返回容器中id为name,并且类型为requiredType的Bean.
4.Class<?>getTYpe(String name):返回容器中指定Bean实例的类型
调用者只要使用getBean()方法即可获得指定Bean的引用,无须关心Bean的实例化过程,既Bean实例的创建过程完全透明.
Application是BeanFactory的子接口,对于大部分javaEE应用而言,使用它作为Spring容器更加方便.其常用实现类:
FileSystemXmlApplicationContext,ClassPathXmlApplicationContext和AnnotationConfigApplicationContext.web应用中使用Spring容器,通常由ClassPathXmlApplicationContext和AnnotationConfigApplicationContext两个类实现.
创建Spring容器的实例时,必须提供Spring容器管理的Bean的详细配置信息.Spring的配置信息通常采用XML配置文件来设值,因此,创建BeanFatory实例时,应该提供XML配置文件作为参数.XML配置文件通常使用Resource对象传入
Resource接口时Spring提供的资源访问接口,通过使用该接口,Spring能以简单,透明的方式访问磁盘,类路径以及网络上的资源.
案列:
package com.spring;

import javafx.application.Application;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;

public class MainApp {
    public static void main(String[] args) {
         //ApplicationContext(子接口)
        ApplicationContext context =
                new ClassPathXmlApplicationContext("Beans.xml");
        //BeanFactory        
        ClassPathResource resource = new ClassPathResource("Beans.xml"); 
        XmlBeanFactory factory = new XmlBeanFactory(resource);
        HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
        obj.getMessage();
        HelloWorld objF = (HelloWorld) factory.getBean("helloWorld");
        obj.getMessage();
    }
}





可以看到,两种方式都能实现
ApplicationContext实现的两个方法:
1.ClassPathXmlApplicationContext:以类加载路径下的XML配置文件创建ApplicationContext实例
如:
一个xml文件:
ApplicationContext context =
                new ClassPathXmlApplicationContext("Beans.xml");


多个xml文件:
ApplicationContext context =
              new ClassPathXmlApplicationContext(new String[]{"Beans.xml","service.xml"});



2.FileSystemXmlApplicationContext:以基于文件系统的XMl配置创建ApplicationContext实例.

BeanFactory的实现方法:
1..
ClassPathResource resource = new  ClassPathResource("Beans.xml"); 
 XmlBeanFactory factory = new XmlBeanFactory(resource);
2.下面这种方法也可以,但是目前不支持了
InputStreamResource inputStreamResource = new FileSystemResource("Bean.xml");
XmlBeanFactory factory = new XmlBeanFactory(inputStreamResource);

使用ApplicationContext
大部分时候,我们都不会使用beanFactory实例作为Spring容器,而是ApplicationContext实例作为容器.ApplicationContext是BeanFactory接口的子接口,它增强了BeanFactory的功能.
ApplicationContext允许以声明方式操作容器,无须手动创建它,可以利用如ContextLoader的支持类,在web应用启动时自动创建ApplicationContext.当然也可以采用编程方式创建.
applicationContext除了提供BeanFactory所支持的全部功能外,ApplicationContext还有如下额外功能:
1.ApplicationContext继承MessageSource接口,因此提供国际化支持.
2.资源访问,比如URL和文件.
3.事件机制
4.载入多个配置文件
5.以声明的方式启动,并创建Spring
一般优先使用 ApplicationContext除非对某些内存非常关键的应用,才考虑使用BeanFactory,
在上述说明中,程序都是先创建Spring容器,再调用容器的getBean()方法来获取Spring容器的Bean.在这种访问模式下,程序总是持有Spring容器的引用.
也会产生代码冗余,但是在实际应用中,尤其是web应用中,Spring容器通常采用声明方式配置产生:开发者只要在Web.xml文件中配置一个Listener,该Listener将会负责初始化Spring容器.前端MVC框架可以直接调用Spring容器(无须访问Spring容器本身),在这种情况下,容器中Bean处于容器管理下,无须主动访问容器,只须接受容器的注入管理即可,非常的实用.Bean实例的依赖关系通常由容器动态注入,无须Bean实例主动请求.
Spring BeanFactory容器和ApplicationContext容器实例化容器的Bean实际不同:前者等到程序需要Bean实例的时才创建bean,而后者在容器创建ApplicationContext实例时,会预初始化容器中的全部Bean







































Spring配置文件的根元素是<beans.../>,该元素可以接收0个到多个<bean..>子元素
下面是Spring最简单的配置文件:
<? xml version ="1.0" encoding ="UTF-8" ?>
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns: xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi :schemaLocation ="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" >
</ beans >
采用XML Schema来定义配置文件的语义结束.也可以用DTD来定义,但如果DTD来定义XML的语义约束,就不能使用Spring2.x,Spring3.0所增添的配置标签.




















































猜你喜欢

转载自blog.csdn.net/lplife/article/details/79677752