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方法(最多使用)

方法二:带参数的构造方法

方法三:使用接口注入(较少用)

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、高富帅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定义资源文件中的<Bean>元素

(1)BeanDefinitionParserDelegate解析<property>元素

(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-

 

转载于:https://my.oschina.net/u/4118408/blog/3050331

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值