一、Spring核心篇

2017-05-15  本文已影响0人  起飞的雏鸟

第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

上一篇下一篇

猜你喜欢

热点阅读