package org.springframework.beans.factory; import org.springframework.beans.BeansException; import org.springframework.core.ResolvableType; //BeanFactory 解析 17/04/27 public interface BeanFactory { //这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象, //如果需要得到工厂本身,需要转义 //转义符“&”用来获取FactoryBean本身 String FACTORY_BEAN_PREFIX = "&"; //根据bean的名字进行获取bean的实例,这是IOC最大的抽象方法 Object getBean(String name) throws BeansException; //根据bean的名字和Class类型进行获取Bean的实例,和上面方法不同的是,bean名字和Bean 的class类型不同时候会爆出异常 <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; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; //检测这个IOC容器中是否含有这个Bean boolean containsBean(String name); //判断这个Bean是不是单利 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; //检测Bena是不是多例, boolean isPrototype(String name) throws NoSuchBeanDefinitionException; //查询指定的bean的名字和Class类型是不是指定的Class类型 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; //这里对得到bean实例的Class类型 Class<?> getType(String name) throws NoSuchBeanDefinitionException; //这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来 String[] getAliases(String name); }
Spring IOC容器最基本的接口BeanFactory,定义了IOC容器最基本的规范,不管如何,作为IOC的容器,这个接口必须满足容器的基本要求.
BeanFactory里只对IOC容器的基本行为作了定义,对于这个工厂怎么做的,我们根本不需要关i心,我们需要的是关心我们要的bean,
我们也可以自己来继承Bean,但是没有必要,Spring中提供了相对应得很多实现了beanfactory的模板给我们调用,
AbstractBeanFactory,DefaultListableBeanFactory,通过resource接口来定义bean数据,然后
对Xml定义文件的解析通过委托给XmlBeanDefinitionReader来完成,
创建IOC的过程:
ClassPathResource beanxml =new ClassPathResource("bean.xml"); DefaultListableBeanFactory factory =new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(beanxml);
以上几部解析:
1.创建Ioc的容器抽象资源
2.创建工厂
3.创建一个读取抽象资源的的 BeanDefinitionReader ,来读取配置文件
4.读取到信息配置到factory中
很明显,这是一个典型的工厂模式的工厂接口。