spring技术内幕笔记:XMLBeanFactory

1.BeanFactory

(1)定义了spring IoC容器的最基本形式,包含了一系列的获取容器中bean的方法,以及获取bean其他信息的方法

(2)一般由其他的容器类如ApplicationContext、XMLBeanFactory实现该接口,管理IoC中的bean。

/**
 * Ioc容器:BeanFactory,是一个接口,定义了基本的IoC容器规范,包含了一系列的获取容器中bean的方法
 */
public interface BeanFactory {

	/**
	 * 用来区分通过容器获取FactoryBean产生的对象和获取FactoryBean本身
	 * e.g.: &myJndiObject获取的是FactoryBean
	 * FactoryBean是一个bean,BeanFactory是一个bean工厂,Spring中所有的bean都由BeanFactory管理
	 */
	String FACTORY_BEAN_PREFIX = "&";

	/**
	 * 通过name获取容器中管理的bean
	 * @param name bean的name
	 * @return bean的一个实例
	 */
	Object getBean(String name) throws BeansException;

	/**
	 * 通过name和class类型获取bean
	 * @param name bean的name
	 * @param requiredType bean的类型
	 * @return an instance of the bean
	 */
	 T getBean(String name, Class requiredType) throws BeansException;

	/**
	 * 通过class 类型获取bean
	 * @return an instance of the single bean matching the required type
	 */
	 T getBean(Class requiredType) throws BeansException;

	/**
	 * 根据name和显示声明的参数获取bean
	 * @param name
	 * @param args 原型模式中显示声明的参数
	 * @return an instance of the bean
	 */
	Object getBean(String name, Object... args) throws BeansException;

	/**
	 * 根据class类型和显示声明的参数获取bean
	 * @param requiredType
	 * @param args
	 * @return an instance of the bean
	 */
	 T getBean(Class requiredType, Object... args) throws BeansException;

	/**
	 * 根据指定的name判断容器中是否包含这个bean
	 * @param name the name of the bean to query
	 * @return whether a bean with the given name is present
	 */
	boolean containsBean(String name);

	/**
	 * 根据name查询该bean是否是单例模式的bean
	 * @param name the name of the bean to query
	 * @return whether this bean corresponds to a singleton instance
	 */
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 根据name查询该bean是否是原型模式的bean
	 * @param name the name of the bean to query
	 * @return whether this bean will always deliver independent instances
	 */
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 根据指定的name和type,判断以这个name命名的bean是否符合指定的class类型
	 * @param name the name of the bean to query
	 * @param targetType the type to match against
	 * @return {@code true} if the bean type matches,
	 */
	boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException;

	/**
	 * 获取指定name的bean的class类型
	 * @param name the name of the bean to query
	 * @return the type of the bean, or {@code null} if not determinable
	 */
	Class getType(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 根据指定name获取bean的所有别名
	 * @param name the bean name to check for aliases
	 * @return the aliases, or an empty array if none
	 */
	String[] getAliases(String name);

}

2.BeanDefinition

描述了容器中的bean对象,在bean容器启动中,其实是将xml配置文件中每个元素转换成了一个BeanDefinition对象


3.DefaultListableBeanFactory

(1)包含了基本IoC容器所具有的重要功能

(2)其他容器可以继承该类,具备容器的基本功能,然后在此基础上,扩展其他功能。


4.XMLBeanFactory

(1)Spirng IoC容器的一个实现,继承了DefaultListableBeanFactory,实现容器的基本功能

(2)扩展功能:通过读取以XML文件方式定义的BeanDefinition的IoC容器

(3)该类已经不推荐使用

/**
 * XmlBeanFactory(现已被废弃,不推荐使用)
 * Spirng IoC容器的一个实现,继承了DefaultListableBeanFactory,实现容器的基本功能
 * 扩展功能:通过读取以XML文件方式定义的BeanDefinition的IoC容器
 */
@Deprecated
@SuppressWarnings({"serial", "all"})
public class XmlBeanFactory extends DefaultListableBeanFactory {

    /**
     * XmlBeanDefinitionReader对象,从资源对象中载入BeanDefination
     */
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);


    /**
     * 构造函数,通过传入一个资源对象,创建实例
     * @param resource spring中的资源对象(XML)
     */
    public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, null);
    }

    /**
     * 构造函数
     * @param resource spring中的资源对象(XML)
     * @param parentBeanFactory BeanFactory对象
     * @throws BeansException in case of loading or parsing errors
     */
    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        //从资源对象中载入BeanDefination
        this.reader.loadBeanDefinitions(resource);
    }

}

编程式IoC建立过程:

  /*-------IoC容器的建立过程------*/
        //加载xml配置文件,实例化资源对象
        ClassPathResource resource=new ClassPathResource("beans.xml");
        //创建一个BeanFactory,这里使用DefaultListableBeanFactory
        DefaultListableBeanFactory factory=new DefaultListableBeanFactory();
        //创建reader对象
        XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(factory);
        //载入xml文件形式的Beandefinition,通过一个回调配置给BeanFactory
        reader.loadBeanDefinitions(resource);


参考:

(1)spring技术内幕

(2)digdeep:深入剖析 Spring 框架的 BeanFactory

(3)一天不进步,就是退步:spring beans源码解读之--XmlBeanFactory


你可能感兴趣的:(spring)