zoukankan      html  css  js  c++  java
  • Spring IoC详解

    Spring IoC详解

     

    1. 控制反转

      控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection, DI)。

      它最大的好处是降低对象之间的耦合度,在一个系统中有哪些类,具体如何实现并不需要去理解,只需要知道它有什么用就可以。只是这里对象的产生依赖于IoC 容器,而不是开发者主动的行为。主动创建的模式,责任归于开发者,而在被动模式下,责任归于IoC容器,基于这样的被动方式,就可以说对象被控制反转了。

    2. Spring IoC容器

      Spring IoC容器的作用就是容纳我们所开发的各种bean,并且我们可以从中获取到各种发布在Spring IoC容器中的各种bean,并且通过描述可以得到它。

      Spring IoC容器的设计主要是基于BeanFactory 和 ApplicationContext两个接口,其中ApplicationContext是BeanFactory 的子接口之一,换句话说就是 BeanFactory 是Spring IoC容器所定义的底层接口,而ApplicationContext 是其高级接口之一,并且对BeanFactory 功能做了很多有用的扩展,所以在大多数情况下,都会使用ApplicationContext作为Spring IoC容器。下图是Spring相关的IoC容器接口的主要设计。

      从这张图中,我们可以看到BeanFactory位于设计的最底层,它提供了SpringIoC最底层的设计,可以看其源码。

    package org.springframework.beans.factory;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.NoSuchBeanDefinitionException;
    
    public interface BeanFactory {
        String FACTORY_BEAN_PREFIX = "&";
    
        Object getBean(String var1) throws BeansException;
    
        <T> T getBean(String var1, Class<T> var2) throws BeansException;
    
        <T> T getBean(Class<T> var1) throws BeansException;
    
        Object getBean(String var1, Object... var2) throws BeansException;
    
        boolean containsBean(String var1);
    
        boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
    
        boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
    
        boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
    
        Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
    
        String[] getAliases(String var1);
    }

      

      下面就源码进行简要分析:

      1)getBean 的多个方法用于获取配置给Spring IoC容器的Bean。从参数类型看可以是字符串,也可以是Class类型。由于Class类型可以扩展接口也可以继承父类,所以在一定程度上会存在使用父类类型无法准确获得实例的异常,比如获取学生类,但是学生子类有男生和女生两类,这个时候通过学生类就无法从容器中得到实例,因为容器无法判断具体的实现类。

      2)isSingleton用于判断是否单例,如果判断为真,其意思是该Bean在容器中是作为一个唯一单例存在的。而IsPrototype则相反,如果判断为真,意思是当你从容器中获取Bean,容器就为你生成一个新的实例。在默认情况下,Spring会为Bean创建一个单例,也就是默认情况下isSingleton返回true,而IsPrototype返回false、

      3)关于type的匹配,这是一个按Java类型匹配的方式。

      4)getAliases是获取别名的方法。

    3.Spring IoC容器的初始化和依赖注入

      在学习理解Spring IoC容器的初始化和依赖注入这个知识点使,我们应该注意到Bean的定义和初始化在Spring IoC容器中是两个步骤,它是先定义,然后初始化和依赖注入的。

    下面主要对bean的定义进行详解。在下一篇博客中将对Spring Bean的生命周期进行详解。

      Bean的定义分为3步:

      1)Resource定位,这步是Spring IoC容器根据开发者的配置,进行资源定位,在Spring的开发中,通过XML或者注解都是十分常见的方式,定位的内容是由开发者提供的。

      2)BeanDefinition的载入,这时只是将resource定位到的信息,保存到Bean定义中(BeanDefinition)中,此时并不会创建Bean的实例。

      3)BeanDefinition的注册,这个过程就是将BeanDefinition的信息发布到Spring IoC容器中,此时仍然没有对应的Bean的实例创建。

      至此,Bean在Spring IoC容器中被定义了,而没有被初始化,更没有完成依赖注入,也就是没有注入其配置的资源给Bean,那么它还不能完全使用。我们只有完成初始化并且对其进行依赖注入后,才可以正常使用。

      欲知故事详情,且听下回分解。对于Spring Bean的生命周期的详细解读,将在下篇博客中详细解读。

      

  • 相关阅读:
    kubernetes入门之kube-proxy实现原理
    kubernetes源码阅读及编译
    docker的网络-Container network interface(CNI)与Container network model(CNM)
    kubernetes入门之skydns
    浅析flannel与docker结合的机制和原理
    kubernetes入门之快速部署
    python并发获取snmp信息及性能测试
    Facebook开源的基于SQL的操作系统检测和监控框架:osquery daemon详解
    Facebook开源的基于SQL的操作系统检测和监控框架:osquery Table详解
    视频工具类产品是个什么玩意,产品经理怎么构思一款视频工具类产品
  • 原文地址:https://www.cnblogs.com/Demrystv/p/9245680.html
Copyright © 2011-2022 走看看