本文乃学习整理参考而来spring
IoC概述:学习
在spring中,IoC容器实现了依赖控制反转,它能够再对象生成或初始化时直接将数据注入到对象中,也能够经过将对象引用注入到对象数据域中的方式来注入方法调用的依赖,这种依赖注入是能够递归的,对象被逐层注入。对象之间的相互依赖关系由IoC容器管理,并由容器完成注入,如对象的建立、赋值等,这样很大程度简化开发。this
结构图以下spa
1.1 BeanFactoryprototype
接口BeanFactory:体现了spring为提供给用户的IoC容器所设定的最基本功能规范。code
接口BeanDefinition:spring经过BeanDefinition来管理spring容器中的各类对象以及他们之间的相互依赖关系。xml
源码以下对象
** * IoC容器最基本功能 * 此类至关于容器中的具体容器产品 * @author qjc */ public interface BeanFactory { /** * 获取产生对象的FactoryBean * 如:myObject是一个FactoryBean,使用&myObject获得的是FactoryBean */ String FACTORY_BEAN_PREFIX = "&"; /** * 获取IoC容器中管理的bean * @param name * @return * @throws BeansException */ Object getBean(String name) throws BeansException; /** * 判断容器是否含有指定名称的bean * @param name * @return */ boolean containsBean(String name); /** * 检查指定名称的bean是不是单例(能够在BeanDefinition中指定) * @param name * @return * @throws NoSuchBeanDefinitionException */ boolean isSingleton(String name) throws NoSuchBeanDefinitionException; /** * 检查指定名称的bean是不是prototype类型(能够在BeanDefinition中指定) * @param name * @return * @throws NoSuchBeanDefinitionException */ boolean isPrototype(String name) throws NoSuchBeanDefinitionException; /** * 检查指定名称的bean的Class类型是不是特定Class类型 * @param name * @param targetType 用户指定 * @return * @throws NoSuchBeanDefinitionException */ boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException; /** * 查询指定名称bean的Class类型 * @param name * @return * @throws NoSuchBeanDefinitionException */ Class<?> getType(String name) throws NoSuchBeanDefinitionException; /** * 查询指定名称bean的全部别名(用户在BeanDefinition中指定的) * @param name * @return */ String[] getAliases(String name); }
说明:blog
在BeanFactory里只对IOC容器的基本行为做了定义,根本不关心你的bean是如何定义怎样加载的。正如咱们只关心工厂里获得什么的产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心。递归
1.2 IoC容器XmlBeanFactory
此类为IoC容器最底层的实现类,提供基本IoC功能。与ApplicationContext实现原理相似,经过持有或扩展DefaultListableBeanFactory来获取IoC容器功能。
关系结构图以下
源码
public class XmlBeanFactory extends DefaultListableBeanFactory { /** * XmlBeanDefinitionReader:读取XML的类 */ private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); /** * @param resource spring用来封装io操做的类,可以下构建 * ClassPathResource resource = new ClassPathResource("bean.xml"); * @throws BeansException */ public XmlBeanFactory(Resource resource) throws BeansException { this(resource, null); } public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); } }
IoC容器建立的基本步骤
ClassPathResource res = new ClassPathResource("bean.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(resource);
一、建立IoC配置文件的抽象资源(包含BenaDefinition定义信息)
二、建立BeanFactory
三、建立BeanDefinition读取器
四、读取配置信息,完成载入和注册后IoC容器就建立出来了
一般咱们不是这么建立的,而是使用ApplictionContext接口建立
1.3 ApplictionContext
ApplictionContext属于高级IoC容器,它在BeanFactory基础上添加了特性(其余容器不具有)。
1. 支持信息源,能够实现国际化。(实现MessageSource接口)
2. 访问资源。(实现ResourcePatternResolver接口,这个后面要讲)
3. 支持应用事件。(实现ApplicationEventPublisher接口)
参考:
《Spring 技术内幕》