第2章 Spring Framework的核心:IoC容器的实现
2.1 Spring IoC容器概述
1.IOC容器 和 控制反转模式。
什么是控制反转? 控制反转就是将对象的控制交给容器去做,而不是在一个对象内部直接控制。是关于一个对象如何获取它所依赖的对象的引用,反转指的是责任的反转。控制的什么被反转了?就是:获得依赖对象的方式反转了。
什么是依赖注入?依赖注入是指容器动态的将某个对象的依赖注入到组件中,注入所需要的外部资源。
“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”:
●谁依赖于谁:当然是应用程序依赖于IoC容器;
●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
http://blog.csdn.net/bestone0213/article/details/47424255
2.2 IoC容器系列的实现:BeanFactory和ApplicationContext
BeanFactory 作用:实例化,配置,管理Bean。
/** * 用来引用一个实例,或把它和工厂产生的Bean区分开,就是说,如果一个FactoryBean的名字为a,那么,&a会得到那个Factory */ String FACTORY_BEAN_PREFIX = "&";
/* * 四个不同形式的getBean方法,获取实例 */
Object getBean(String name) throws BeansException;
T getBean(String name, ClassrequiredType) throws BeansException;
T getBean(Class requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
boolean containsBean(String name); // 是否存在
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否为单实例
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否为原型(多实例)
boolean isTypeMatch(String name, Class targetType)
throws NoSuchBeanDefinitionException;// 名称、类型是否匹配
Class getType(String name) throws NoSuchBeanDefinitionException; // 获取类型
String[] getAliases(String name);// 根据实例的名字获取实例的别名
BeanFactory继承结构:
BeanFactory只提供基本的IOC容器功能。
需要依赖其他的接口来实现功能。例如XmlBeanFactory:
XmlBeanFactory继承自DefaultListableBeanFactory,扩展了从xml文档中读取bean definition的能力。从本质上讲,XmlBeanFactory等同于DefaultListableBeanFactory+XmlBeanDefinitionReader ,如果有更好的需求,可以考虑使用DefaultListableBeanFactory+XmlBeanDefinitionReader方案,因为该方案可以从多个xml文件读取资源,并且在解析xml上具有更灵活的可配置性。典型构造方法:
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
通过XmlBeanFactory 可以清楚的揭示IOC容器实现中的那先关键类(Resource,DefaultListableBeanFactory 和 BeanDefinitionReader)之间的调用关系,他们是如何把IOC容器的功能解耦,又是如何结合在一起为IOC容器服务的。
编程式使用IOC容器:
-----------------------------------------------------------------------------------------------------------------
ClassPathResource res = new ClassPathResource("beans.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
------------------------------------------------------------------------------------------------------------------
1、创建IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息。
2、创建一个BeanFactory,这里使用DefaultListableBeanFactory。
3、创建一个载入BeanDefinition的读入器,这里使用XmlBeanDefinitionReader来载入XML文件形式的BeanDefinition,通过一个回调配置给BeanFactory。
4、从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。
ClassPathResource
http://www.cnblogs.com/davidwang456/p/4204569.html
2.3 IoC容器的初始化
1.Resoure定位过程;寻找数据
2.BeanDefinition载入过程;
3.向IOC容器注册BeanDefinition过程;
2.4 IoC容器的依赖注入
2.5 容器其他相关特性的实现
2.6 小结
http://www.cnblogs.com/davidwang456/p/4204569.html
http://www.cnblogs.com/davidwang456/p/4204569.html
http://www.cnblogs.com/davidwang456/p/4204569.html