zoukankan      html  css  js  c++  java
  • Spring IoC的概念

    Spring IoC的基础知识

    Spring 框架可以说是Java世界中最成功的框架,它的成功来自于理念,而不是技术,它最核心的理念是IoC(控制反转)和AOP(面向切面编程),其中IoC是Spring的基础,而AOP则是其最重要的功能。

    1.Spring IoC概述

    控制反转是一个比较抽象的概念,先举一个实际生活中的例子说明。当人们想喝苹果汁的时候,在没有饮品店的时候,最直观的做法是,要买榨汁机,苹果和矿泉水。这些东西都是自己“主动”创造的过程,也就是这杯苹果汁需要自己主动创造。然而如今,有各种饮品店自己没必要去榨果汁了。如果想要喝苹果汁,可以直接找到饮品店的联系方式,描述想要的饮料信息,留下地址和联系方式下单等待即可。在这个过程中我并没有“主动”创造苹果汁,也就是苹果汁是由饮品店创造的,而不是我自己,但也达到了我的要求。在潜意识里我们会觉得对象应该由我们主动创造,但事实上这并不是我们的真实需求,因为也许你对这个领域并不精通,这个时候把创建对象的主动权转交给别人,这就是控制反转的概念。控制反转这个理念虽然理解上有些困难,但是好处在于降低了对象之间的耦合。这里对象的产生依靠于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容器。

    下面是BeanFactory的源码(去掉了注释)

     1 package org.springframework.beans.factory;
     2 
     3 import org.springframework.beans.BeansException;
     4 import org.springframework.core.ResolvableType;
     5 import org.springframework.lang.Nullable;
     6 
     7 public interface BeanFactory {
     8 
     9     String FACTORY_BEAN_PREFIX = "&";
    10 
    11     Object getBean(String name) throws BeansException;
    12 
    13     <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
    14 
    15     Object getBean(String name, Object... args) throws BeansException;
    16 
    17     <T> T getBean(Class<T> requiredType) throws BeansException;
    18 
    19     <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
    20 
    21     boolean containsBean(String name);
    22 
    23     boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    24 
    25     boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    26 
    27     boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    28 
    29     boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    30 
    31     
    32     @Nullable
    33     Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    34 
    35     String[] getAliases(String name);
    36 
    37 }

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

    Bean的定义和初始化在Spring IoC容器是两大步骤,先是定义,然后初始化和依赖注入。

    Bean定义分为3步:

    1. Resource定位,这步是Spring IoC容器根据开发者的配置,进行资源定位(通过XML或者注解)
    2. BeanDefinition的载入,将Resource定位信息保存到Bean的定义中(BeanDefinition),此时并不会创建Bean实例
    3. BeanDefinition的注册,将BeanDefinition的信息发布到Spring IoC容器中,此时仍旧没有对应Bean的实例创建

    做完这三步Bean就在Spring IoC容器中被定义了,而没有初始化和依赖注入。对于初始化和依赖注入,Spring Bean有一个配置选项---lazy-init,在没有配置情况下,默认值default为false,也就是默认自动初始化Bean。将其设置为true,只有当使用Spring IoC容器的getBean方法获取它时,它才会初始化,完成依赖注入。

    4.Spring Bean的生命周期

    从上图(图来源《Java EE互联网轻量级框架整合开发 》)可以看到Spring IoC容器在执行了初始化和依赖注入后,会执行一定步骤来完成初始化,通过这些步骤就可以自定义初始化,而在Spring IoC容器正常关闭的时候,它会执行一定步骤关闭容器释放资源。注意,从上图可以看到有些方法需要实现特定的接口才能实现。

  • 相关阅读:
    prometheus 文档
    go
    nginx
    python使用xlrd读取合并单元格
    python使用xlrd模块读取Excel
    创建Excel文件:ModuleNotFoundError: No module named 'openpyxl'
    openpyxl模块安装时报错: You are using pip version 19.2.3, however version 20.0.2 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.
    Python定义字典函数报错TypeError: takes 0 positional arguments but 1 was given
    Mysql--information_scherma(虚拟库)
    day07--MySQL索引
  • 原文地址:https://www.cnblogs.com/qzwl/p/11597515.html
Copyright © 2011-2022 走看看