控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,能够用来减低计算机代码之间的耦合度。spring
其中最多见的方式叫作依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。经过控制反转,对象在被建立的时候,由一个调控系统内全部对象的外界实体将其所依赖的对象的引用传递给它。也能够说,依赖被注入到对象中。编程
第一种:经过容器完成依赖关系的注入框架
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" 函数
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" this
xmlns:p="http://www.springframework.org/schema/p"spa
xsi:schemaLocation="http://www.springframework.org/schema/beans 设计
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> xml
<实现类实例化--> 对象
<bean id="geli" class="LiuDeHua"/> 接口
<bean id="moAttack" class="com.baotao.ioc.MoAttack"
p:geli-ref="geli"/><!--经过geli-ref创建依赖关系-->
</beans>
属性注入的方式介绍(三种方式)
在spring框架里面仅支持1.2.方法。
方法一:属性的set方法(最多使用)
方法二:带参数的构造方法
方法三:使用接口注入(较少用)
public class MoAttack {
private GeLi geli;
//属性注入方法
public void setGeli(GeLi geli) {
this.geli = geli;
}
public void cityGateAsk() {
geli.responseAsk("消费者");
}
}
--------------------------------------------------------------------------------------------------MoAttack为geli属性提供一个Setter方法,以便让导演在须要时注入geli的具体扮演者
Director:经过Setter方法注入提供者public class Director {
public void direct(){
GeLi geli = new LiuDeHua();
MoAttack moAttack = new MoAttack();
//调用属性Setter方法注入
moAttack.setGeli(geli);
moAttack.cityGateAsk();
}
}
将调用类全部依赖注入的方法抽取到一个接口中,调用类经过实现该接口提供相应的注入方法。为了采起接口注入的方式,必须先声明一个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)AbstractApplicationContext的refresh函数载入Bean定义过程
(2)AbstractApplicationContext子类的refreshBeanFactory()方法
(3)AbstractRefreshableApplicationContext子类的loadBeanDefinitions方法
(4)AbstractBeanDefinitionReader读取Bean定义资源
三、资源加载器获取要读入的资源:
(1)XmlBeanDefinitionReader加载Bean定义资源
(2)DocumentLoader将Bean定义资源转换为Document对象
(3)XmlBeanDefinitionReader解析载入的Bean定义资源文件
(4)DefaultBeanDefinitionDocumentReader对Bean定义的Document对象解析
四、BeanDefinitionParserDelegate解析Bean定义资源文件中的<Bean>元素
(1)BeanDefinitionParserDelegate解析<property>元素
(2)解析元素的子元素
(3)解析子元素
五、解析事后的BeanDefinition在IoC容器中的注册:
DefaultListableBeanFactory向IoC容器注册解析后的BeanDefinition
一、介绍
二、Spring IoC容器的lazy-init属性实现预实例化:
(1).refresh()
(2).finishBeanFactoryInitialization处理预实例化Bean
(3).DefaultListableBeanFactory对配置lazy-init属性单态Bean的预实例化
三、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-