美文网首页
XmlBeanFactory和ApplicationContex

XmlBeanFactory和ApplicationContex

作者: onlyHalfSoul | 来源:发表于2018-08-01 15:23 被阅读238次

    BeanFactory

    BeanFactory 是 Spring 的“心脏”。它就是 Spring IoC 容器的真面目。Spring 使用 BeanFactory 来实例化、配置和管理 Bean。

    BeanFactory:是IOC容器的核心接口, 它定义了IOC的基本功能,我们看到它主要定义了getBean方法。getBean方法是IOC容器获取bean对象和引发依赖注入的起点。方法的功能是返回特定的名称的Bean。

    BeanFactory 是初始化 Bean 和调用它们生命周期方法的“吃苦耐劳者”。注意,BeanFactory 只能管理单例(Singleton)Bean 的生命周期。它不能管理原型(prototype,非单例)Bean 的生命周期。这是因为原型 Bean 实例被创建之后便被传给了客户端,容器失去了对它们的引用。

    BeanFactory有着庞大的继承、实现体系,有众多的子接口、实现类。来看一下BeanFactory的基本类体系结构(接口为主):


    image

    具体:
      1、BeanFactory作为一个主接口不继承任何接口,暂且称为一级接口。
      2、有3个子接口继承了它,进行功能上的增强。这3个子接口称为二级接口。
      3、ConfigurableBeanFactory可以被称为三级接口,对二级接口HierarchicalBeanFactory进行了再次增强,它还继承了另一个外来的接口SingletonBeanRegistry
      4、ConfigurableListableBeanFactory是一个更强大的接口,继承了上述的所有接口,无所不包,称为四级接口。
      (这4级接口是BeanFactory的基本接口体系。继续,下面是继承关系的2个抽象类和2个实现类:)
      5、AbstractBeanFactory作为一个抽象类,实现了三级接口ConfigurableBeanFactory大部分功能。
      6、AbstractAutowireCapableBeanFactory同样是抽象类,继承自AbstractBeanFactory,并额外实现了二级接口AutowireCapableBeanFactory
      7、DefaultListableBeanFactory继承自AbstractAutowireCapableBeanFactory,实现了最强大的四级接口ConfigurableListableBeanFactory,并实现了一个外来接口BeanDefinitionRegistry,它并非抽象类。
      8、最后是最强大的XmlBeanFactory,继承自DefaultListableBeanFactory,重写了一些功能,使自己更强大。

    总结:
      BeanFactory的类体系结构看似繁杂混乱,实际上由上而下井井有条,非常容易理解。
    BeanFactory接口的源码如下:

    package org.springframework.beans.factory;
    
    public interface BeanFactory {
    
        /**
         * 用来引用一个实例,或把它和工厂产生的Bean区分开,就是说,如果一个FactoryBean的名字为a,那么,&a会得到那个Factory
         */
        String FACTORY_BEAN_PREFIX = "&";
    
        /*
         * 四个不同形式的getBean方法,获取实例
         */
        Object getBean(String name) throws BeansException;
    
        <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    
        <T> T getBean(Class<T> requiredType) throws BeansException;
    
        Object getBean(String name, Object... args) throws BeansException;
    
        boolean containsBean(String name); // 是否存在
    
        boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否为单实例
    
        boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否为原型(多实例)
    
        boolean isTypeMatch(String name, Class<?> targetType)
                throws NoSuchBeanDefinitionException;// 名称、类型是否匹配
    
        Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 获取类型
    
        String[] getAliases(String name);// 根据实例的名字获取实例的别名
    
    }
    

    具体:
      1、4个获取实例的方法。getBean的重载方法。
      2、4个判断的方法。判断是否存在,是否为单例、原型,名称类型是否匹配。
      3、1个获取类型的方法、一个获取别名的方法。根据名称获取类型、根据名称获取别名。一目了然!
    总结:
      这10个方法,很明显,这是一个典型的工厂模式的工厂接口。

    BeanFactory最常见的实现类为XmlBeanFactory,可以从classpath或文件系统等获取资源。

    File file = new File("fileSystemConfig.xml");
    Resource resource = new FileSystemResource(file);
    BeanFactory beanFactory = new XmlBeanFactory(resource);
    
    Resource resource = new ClassPathResource("classpath.xml"); 
    BeanFactory beanFactory = new XmlBeanFactory(resource);
    

    通过XmlBeanFactory实现启动Spring IoC容器:

    public static void main(String[] args) {
    
         ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
          Resource res = resolver.getResource("classpath:applicationContext.xml");
          BeanFactory factory = new XmlBeanFactory(res);     
        //ApplicationContext factory=new ClassPathXmlApplicationContext("applicationContext.xml"); 
                
           Car car = factory.getBean("car1",Car.class);
           System.out.println("car对象已经初始化完成");
           System.out.println(car.getMaxSpeed());
    }
    
    1. XmlBeanFactory通过Resource装载Spring配置信息冰启动IoC容器,然后就可以通过factory.getBean从IoC容器中获取Bean了。
    2. 通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean,初始化动作发生在第一个调用时。
    3. 对于单实例(singleton)的Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean时直接从IoC容器缓存中获取Bean。

    ApplicationContext

    如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的躯体了,ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置实现。

    BeanFactorty接口提供了配置框架及基本功能,但是无法支持spring的aop功能和web应用。而ApplicationContext接口作为BeanFactory的派生,因而提供BeanFactory所有的功能。而且ApplicationContext还在功能上做了扩展,相较于BeanFactorty,ApplicationContext还提供了以下的功能:

    (1)MessageSource, 提供国际化的消息访问
    (2)资源访问,如URL和文件
    (3)事件传播特性,即支持aop特性
    (4)载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层

    ApplicationContext:是IOC容器另一个重要接口, 它继承了BeanFactory的基本功能, 同时也继承了容器的高级功能,如:MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布接口)等。

    二者区别

    作用:

    1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。

    2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
      a. 国际化支持
      b. 资源访问:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
      c. 事件传递:通过实现ApplicationContextAware接口

    3. 常用的获取ApplicationContext

    FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组,有相对路径与绝对路径。

    ApplicationContext factory=new FileSystemXmlApplicationContext("src/applicationContext.xml");
    ApplicationContext factory=new FileSystemXmlApplicationContext("E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");
    

    ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件。ClassPathXmlApplicationContext 编译路径总有三种方式:

    ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    ApplicationContext factory = new ClassPathXmlApplicationContext("file:E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");
    

    XmlWebApplicationContext:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现

    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    

    或者

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

    这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件

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

    相关文章

      网友评论

          本文标题:XmlBeanFactory和ApplicationContex

          本文链接:https://www.haomeiwen.com/subject/dfhrvftx.html