一.IoC容器的设计与实现

一.概述

    Spring FrameWork的第一大核心,IoC是对对象进行控制反转,也成为依赖注入.依赖控制反转(把对象的控制权从业务的业务对象手中转交给平台或者框架)的模式有很多种,在spring中IoC容器是实现这个模式的载体.

    依赖注入的方式:1.接口注入;2.setter注入;3.构造器注入.IoC设计中,setter和构造器注入是主要的注入方式.

二.IoC中两个主要的容器系列

    1.实现了BeanFactory接口的简单容器系统,实现了容器的最基本功能

    2.ApplicationContext应用上下文,作为容器的高级形态存在.

容器中起作用的主要数据类型是BeanDefinition,它是对依赖反转模式中管理的对象依赖关系的数据抽象,依赖反转功能都是围绕着对这个BeanDefinition的处理完成的.


三.IoC容器的设计


从上面接口设计图中可以看到两条主要的设计主线:

    第一条从BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是主要的BeanFactory设计路径.通过这些接口设计的叠加,定义了BeanFactory就是简单IoC容器的基本功能.

    第二条是以ApplicationContext应用上下文接口为核心的接口设计.对于AppilcationContext除了细化了许多BeanFactory的接口能外之外,还通过继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,添加了许多对高级容器的特性的支持.

1).BeanFactory的应用场景

package com.zqr.SpringDetail.org.springframework.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;

public interface BeanFactory {

	/**
	 * 用&符号获取BeanFactory本身,用来区分通过容器获取FactoryBean产生的对象和FactoryBean本身.
	 * 	比如:myJndiObject是一个FactoryBean,使用&myJndiObject获取到的是FactoryBean,而不是myJndiObject产生的对象.
	 * 
	 * 	Pass:
	 * 		BeanFactory与FactoryBean
	 * 			BeanFactory是一个Factory,用来管理Bean;
	 * 			FactoryBean是一个工厂Bean,能够产生和修饰对象生成.
	 */
	String FACTORY_BEAN_PREFIX = "&";


	/**
	*	使用不同的Bean检索方法,从IoC容器中得到所需要的Bean,从而忽略具体的IoC实现.
	*这些检索方法代表的是最为基本的容器入口.
	*/
	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;
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

	/**
	 * 容器是否含有指定名字的Bean
	 */
	boolean containsBean(String name);

	/**
	 * 指定名字的Bean是否是Singleton类型.
	 * Pass:对于Singleton属性,可以在BeanDefinition中指定.
	 */
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 指定名字的Bean是否是Prototype类型.
	 */
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	/**
	 * 查询指定名字的Bean的Class类型是否是特定的Class类型.
	 */
	boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	/**
	 * 查询指定名字的Bean的Class类型.
	 */
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 查询指定名字的Bean的所有别名.这些别名都是用户在BeanDefinition中定义的.
	 */
	String[] getAliases(String name);

}

2).BeanFactory容器的设计原理

以XmlBeanFactory为例,最底层实现,与应用上下文相比,显著的特点是:它能提供最基本的IoC容器功能.

1.继承DefaultListableBeanFactory拥有默认完成的IoC容器功能外,还可以读取Xml文件定义BeanDefinition.


2.XmlBeanFactory源码实现读取Xml文件功能

@Deprecated
@SuppressWarnings({"serial", "all"})
public class XmlBeanFactory extends DefaultListableBeanFactory {

	private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);

	public XmlBeanFactory(Resource resource) throws BeansException {
		this(resource, null);
	}

	public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
		super(parentBeanFactory);
		this.reader.loadBeanDefinitions(resource);
	}

/**
*    总结分析具体的实现步骤:
*        1.创建IoC配置文件的抽象资源resource,资源包含了BeanDefinition.
*        2.创建BeanFactory,这里使用DefaultListableBeanFactory.
*        3.创建BeanDefinition读取器,这里使用XmlBeanDefinitionReader,通过回调配置给BeanFactory.
*        4.从定义好的资源位置读入配置信息,由XmlBeanFactory完成具体的解析过程.最终建立起IoC容器.
*
*
编程式实现
ClassPathResource res = new ClassPathResource("beans.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
}

3).ApplicationContext的应用场景

appicationContext是一个高级形态的IoC容器,在BeanFactory的基础上添加了额外的功能,从而具备了新特性:


4).ApplicationContext容器的设计原理

如:以FileSystemXmlApplicationContext来说明ApplicationContext的设计原理.


ApplicationContext应用上下文的主要功能已经在FileSystemXmlApplicationContext的基类AbstractXmlApplicationContext中实现,它只需要实现和它自身设计相关的两个功能即可.


猜你喜欢

转载自blog.csdn.net/zz_ddup/article/details/80567831