我们上节课,已经实现了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资源。