菜鸟的成长之路——BeanFactory容器

  我们上节课,已经实现了spring的一个hello world,这节课,我们主要来学习一下spring的容器(BeanFactory)。BeanFactory是spring的最核心的一个接口,它的职责包括:实例化、定位、配置应用程序的对象、建立这些对象的依赖。

1、BeanFactory是什么?

  BeanFactory是一个类工厂,他不是管理单一类型的类,而是可以管理各种类型的类,这些被它管理的类,并没有什么特别之处,他们都是再简单不过的POJO,spring称这些被创建和管理的java对象为bean,所以beanFactory就是这些不同类型bean的工厂。
  这些bean,并不只是javabean,bean的范围要更广泛一些,可以被spring容器实例化并进行管理的类,都可以成为bean。
  BeanFactory只是一个接口,他本身不能被实例,但是它提供了getBean(String beanName)方法,该方法从容器中返回特定名称的bean。虽然它不能被实例,但是它通过其他实现类对其进行了扩展,我们来看一下BeanFactory的体系结构图:

这里写图片描述

2、这个图该如何进行分析?

  这个图中,橘黄色的是接口,天蓝色的是实现类,我们首先要分析每个接口都是干什么的,然后就可以知道每个实现类具有的功能了。下面我们来分析一下。
  ListableBeanFactory接口,定义了访问容器中bean基本信息的若干个方法,比如容器中有多少个bean、某个类型的bean的配置名是什么、容器中是否包含某个bean等方法。
  HierarchicalBeanFactory接口,提供方法供子容器访问父容器。
  ConfigurableBeanFactory接口,增强了ioc容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法,也就是容器更深层的配置。又因为它继承了HierarchicalBeanFactory接口,所以他也具备子容器访问父容器的方法。
  ConfigurableListableBeanFactory接口,因为实现了ListableBeanFactory接口和ConfigurableBeanFactory接口,所以具备了这两个接口的所有能力。
  BeanDefinitionRegistry接口,并不是BeanFactory的子接口。在spring配置文件中每个bean节点都是通过一个BeanDefinition对象表示,这个对象描述了bean的配置信息,而beanDefinitionRegistry接口,提供了手动注册BeanDefinition对象的方法。
  AutowireCapableBeanFactory接口,定义了将容器中的Bean按照某种规则进行自动装配的方法,说的直白一些,就是提供了让两个bean自动产生依赖关系的方法,或者通过名字,或者通过类型等。
  SingletonBeanRegistry接口,提供了运行期间,向容器中注册单例bean的方法。

3、BeanFactory接口的实现类应该如何使用?

  从体系结构图上可以看出,这五个实现类具有线性的继承关系,我们主要详解XmlBeanFactory类。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

    <bean id="peo" class="People"></bean>

</beans>

SpringTest.java

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class SpringTest{
    public static void main(String[] args) {
        Resource resource = new ClassPathResource("applicationContext.xml");
        BeanFactory bf = new XmlBeanFactory(resource);
        People people = (People) bf.getBean("peo");
    }
}

  这样,我们就是用BeanFactory获取到容器中的对象了。
  也许,你的编译器会提示你这个api已经过期了,不要担心,我们下节课会讲一种代替BeanFactory的方法。但是现在,我们继续研究BeanFactory。
  我们看到,BeanFactory实例的时候,需要使用Resource来获取配置资源文件,我们来看一下spring中的Resource如何使用的呢?Resource实现类解释如下:

  • ByteArrayResource:从二进制数组中获取资源,也就是字节数组中获取配置文件资源。

  • ClassPathResource:从类路径下获取资源,资源以相对类路径的方式表示,上面例子就是这样。

  • FileSystemResource:从文件系统中,即原生的File类中获取资源。

  • InputStreamResource:从输入流中获取资源。

  • ServletContextResource:可以从相对web根目录的路径加载资源,支持以流和URL的方式访问,还可以直接从jar保重访问资源。

  • UrlResource:用户可以访问任意url表示的资源,无论是文件系统、http资源还是ftp资源。
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值