IoC 的概念
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。
其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
IoC最常见的三种形式:
第一种:通过容器完成依赖关系的注入
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<实现类实例化-->
<bean id="geli" class="LiuDeHua"/>
<bean id="moAttack" class="com.baotao.ioc.MoAttack"
p:geli-ref="geli"/><!--通过geli-ref建立依赖关系-->
</beans>
复制代码
第二种:属性注入 属性注入的方式介绍(三种方式) 在spring框架里面仅支持1.2.方法。 方法一:属性的set方法(最多使用) 方法二:带参数的构造方法 方法三:使用接口注入 (较少用)
第三种:接口注入
将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。为了采取接口注入的方式,必须先声明一个Arrangable接口:
`public interface Arrangable { void injectGeli(GeLi geli); }
然后,MoAttack实现Arrangable接口提供具体的实现 public class MoAttack implements Arrangable { private GeLi geli; //实现接口方法 public void injectGeli (GeLi geli) { this.geli = geli; } public void cityGateAsk() { geli.responseAsk("消费者"); } } `
明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系。
IoC容器的初始化:
1、高富帅IOC解剖
2、 设置资源加载器和资源定位: (1).AbstractApplicationContext的refresh函数载入Bean定义过程 (2).AbstractApplicationContext子类的refreshBeanFactory()方法 (3)AbstractRefreshableApplicationContext子类的loadBeanDefinitions方法 (4).AbstractBeanDefinitionReader读取Bean定义资源
3、资源加载器获取要读入的资源: (1).XmlBeanDefinitionReader加载Bean定义资源 (2).DocumentLoader将Bean定义资源转换为Document对象 (3).XmlBeanDefinitionReader解析载入的Bean定义资源文件 (4).DefaultBeanDefinitionDocumentReader对Bean定义的Document对象解析
4、BeanDefinitionParserDelegate解析Bean定义资源文件中的元素 (1).BeanDefinitionParserDelegate解析元素 (2).解析元素的子元素 (3).解析子元素
5、解析过后的BeanDefinition在IoC容器中的注册: DefaultListableBeanFactory向IoC容器注册解析后的BeanDefinition
IoC容器的高级特性
1、介绍
2、Spring IoC容器的lazy-init属性实现预实例化: (1).refresh() (2).finishBeanFactoryInitialization处理预实例化Bean (3).DefaultListableBeanFactory对配置lazy-init属性单态Bean的预实例化
3、FactoryBean的实现: (1).FactoryBean的源码如下 (2).AbstractBeanFactory的getBean方法调用FactoryBean (3).AbstractBeanFactory生产Bean实例对象 (4).工厂Bean的实现类getObject方法创建Bean实例对象
4.BeanPostProcessor后置处理器的实现: (1).BeanPostProcessor的源码如下 (2).AbstractAutowireCapableBeanFactory类对容器生成的Bean添加后置处理器 (3).initializeBean方法为容器产生的Bean实例对象添加BeanPostProcessor后置处理器 (4).AdvisorAdapterRegistrationManager在Bean对象初始化后注册通知适配器
5.Spring IoC容器autowiring实现原理: (1).AbstractAutoWireCapableBeanFactory对Bean实例进行属性依赖注入 (2).Spring IoC容器根据Bean名称或者类型进行autowiring自动依赖注入 (3).DefaultSingletonBeanRegistry的registerDependentBean方法对属性注入
-END-
复制代码