Spring中beanFactory与ApplicationContext的简介说明

转自:

Spring中beanFactory与ApplicationContext的简介说明

下文笔者将讲述Spring中beanFactory和ApplicationContext的简介说明,如下所示

BeanFactory简介

BeanFactory是spring容器的顶级接口
 此接口中定义了IOC常用的方法
  getBean,isSingleton,isTypeMatch,getType
  getAliases等
BeanFactory是一个一级接口,不被任何接口继承
BeanFactory被三个子接口继承,
BeanFactory拥有众多子接口,实现类
Spring使用BeanFactory进行实例化,配置,管理Bean
通过查看DefaultListableBeanFactory的类结构图,我们可以得出以下结论
 BeanFactory是顶级接口
 ListableBeanFactory,HierarchicalBeanFactory,AutowireCapableBeanFactory
 是二级接口,继承于BeanFactory 
 三级接口:ConfigurableBeanFactory 继承于HierachicalBeanFactory
 四级接口:ConfigurableListableBeanFactory继承上述所有接口
 AbstractBeanFactory是抽象类,实现了三级接口ConfigurableBeanFactory大部分功能
 AbstractAutowireCapableBeanFactory同样是抽象类,继承自AbstractBeanFactory,并额外实现了二级接口AutowireCapableBeanFactory
 DefaultListableBeanFactory继承自AbstractAutowireCapableBeanFactory,实现了最强大的四级接口ConfigurableListableBeanFactory,并实现了一个外来接口BeanDefinitionRegistry,它并非抽象类。
 最后是最强大的XmlBeanFactory,继承自DefaultListableBeanFactory,重写了一些功能,使自己更强大

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);// 根据实例的名字获取实例的别名

}
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可以加载xml的配置文件 

例:

package com.java265.springTest;

public class User {
    private String name; 
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
 
    public String toString(){
        return "the User is:"+ getName();
    }

    public User() {

    }

    public User(String name) {
        this.name = name;
    }
}

我们通过在applicationContext.xml中配置:

<bean id="User1" class="com.java265.springTest.User"
        p:name="我爱java" 
         />

使用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"); 
            
       User User = factory.getBean("User1",User.class);
       System.out.println("User对象已经初始化完成");
       System.out.println(User.getName());
}

1.XmlBeanFactory通过Resource装载Spring配置信息冰启动IoC容器,然后就可以通过factory.getBean从IoC容器中获取Bean了。
2.使用BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean,初始化动作发生在第一个调用时。
3.对于单实例(singleton)Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean时直接从IoC容器缓存中获取Bean。

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(应用事件发布接口)等

ApplicationContext和BeanFactory的区别说明

1.BeanFactroy采用的是延迟加载形式来注入Bean
  即只有在使用到某个Bean时(调用getBean())
   才对该Bean进行加载实例化
   我们就不能发现一些存在的Spring的配置问题
   而ApplicationContext则相反
   它是在容器启动时
   一次性创建了所有的Bean
   此时如果有配置错误,则容器启动时,则会产生相应配置错误,当Bean比较多时,则程序启动比较慢 

BeanFacotry延迟加载
  如果Bean的某一个属性没有注入
   BeanFacotry加载后
  直至第一次使用调用getBean方法才会抛出异常
   而ApplicationContext则在初始化自身是检验
   这样有利于检查所依赖属性是否注入
   所以通常情况下我们选择使用 ApplicationContext。

   应用上下文则会在上下文启动后预载入所有的单实例Bean
   通过预载入单实例bean
   
2.BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用
   但两者之间的区别是
     BeanFactory需要手动注册
    ApplicationContext则是自动注册
    (Applicationcontext比 beanFactory 加入了一些更好使用的功能,
	  而beanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现
      如后处理 bean,Applicationcontext直接配置在配置文件即可而beanFactory这要在代码中显示的写出来才可以被容器识别)

3.beanFactory主要是面对与spring 框架的基础设施
    面对spring 自己
   Applicationcontex 主要面对与spring使用的开发者

   通常我们都会使用Applicationcontex而不是使用beanFactory

常用的获取ApplicationContext

FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组,有相对路径与绝对路径
ApplicationContext factory=new FileSystemXmlApplicationContext("src/applicationContext.xml");
ApplicationContext factory=new FileSystemXmlApplicationContext("D:/test/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:D:/test/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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值