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的源码(去掉了注释)

 package org.springframework.beans.factory;

 import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable; public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; Object getBean(String name) throws BeansException; <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; boolean containsBean(String name); boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isPrototype(String name) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException; @Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException; String[] getAliases(String name); }

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容器正常关闭的时候,它会执行一定步骤关闭容器释放资源。注意,从上图可以看到有些方法需要实现特定的接口才能实现。

Spring IoC的概念的更多相关文章

  1. Spring4- 01 - Spring框架简介及官方压缩包目录介绍- Spring IoC 的概念 - Spring hello world环境搭建

    一. Spring 框架简介及官方压缩包目录介绍 主要发明者:Rod Johnson 轮子理论推崇者: 2.1 轮子理论:不用重复发明轮子. 2.2 IT 行业:直接使用写好的代码. Spring 框 ...

  2. 【spring源码分析】spring ioc容器之前生今世--DefaultListableBeanFactory源码解读

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  3. Spring IOC Container原理解析

    Spring Framework 之 IOC IOC.DI基础概念 关于IOC和DI大家都不陌生,我们直接上martin fowler的原文,里面已经有DI的例子和spring的使用示例 <In ...

  4. 攻城狮在路上(贰) Spring(二)--- Spring IoC概念介绍

    一.IoC的概念: IoC(控制反转)是Spring容器的核心.另一种解释是DI(依赖注入),即让调用类对某一个接口的依赖关系由第三方注入,以移除调用类对某一个接口实现类的一览. 定义如此,由此可见, ...

  5. Spring之旅第二篇-Spring IOC概念及原理分析

    一.IOC概念 上一篇已经了解了spring的相关概念,并且创建了一个Spring项目.spring中有最重要的两个概念:IOC和AOP,我们先从IOC入手. IOC全称Inversion of Co ...

  6. Spring IOC容器启动流程源码解析(一)——容器概念详解及源码初探

    目录 1. 前言 1.1 IOC容器到底是什么 1.2 BeanFactory和ApplicationContext的联系以及区别 1.3 解读IOC容器启动流程的意义 1.4 如何有效的阅读源码 2 ...

  7. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)

    一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...

  8. 程序员笔记|Spring IoC、面向切面编程、事务管理等Spring基本概念详解

    一.Spring IoC 1.1 重要概念 1)控制反转(Inversion of control) 控制反转是一种通过描述(在java中通过xml或者注解)并通过第三方去产生或获取特定对象的方式. ...

  9. Spring IOC 概念及作用

    一:程序之间的耦合及解决 耦合性(Coupling):也叫耦合度,是对模块间关联程度的度量.耦合的强弱取决于模块间接口的复杂性.调用模块的方式以及通过界面传送数据的多少.模块间的耦合度是指模块之间的依 ...

随机推荐

  1. 【Elasticsearch 搜索之路】(一)什么是 Elasticsearch?

    本篇文章对 Elasticsearch 做了基本介绍,在后续将通过专栏的方式持续更新,本系列以 Elasticsearch7 作为主要的讲解版本,欢迎各位大佬指正,共同学习进步! 一般涉及大型数据库的 ...

  2. ADB命令无法导出文件到物理机上处理办法

    因为想查看一下脚本生成的sqlite文件.就想导出文件,,结果导出adb pull命令一直报错.使用su也是错误的..最后发现adb pull 不能再adb的命令状态下执行.需要退出adb命令.然后直 ...

  3. PID算法的理解及场景模拟

    增量式PID算法的简化版之后的公式: △u(t)=Ae(t)-Be(t-1)+Ce(t-2) △u:PID控制器输出的下一时刻的调整量 e(t):PID控制器在当前时刻的状态变化量-给定值 e(t-1 ...

  4. Linux配置python

    文章出处  https://www.cnblogs.com/yhongji/p/9383857.html 我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本 ...

  5. PCIE DMA实现

    基于Spartan-6, Virtex-5/Virtex-6/Virtex-7/7 Series FPGA PCI Express Block Endpoint模块设计PCI Express Endp ...

  6. Stack Overflow 上 250W 浏览量的一个问题:你对象丢了

    在逛 Stack Overflow 的时候,发现最火的问题竟然是:什么是 NullPointerException(java.lang.NullPointerException),它是由什么原因导致的 ...

  7. Jenkins构建Jmeter项目之源代码管理(SVN)

    1.查看项目创建中是否又svn插件,没有的话下载插件subversion 2.配置svn源代码管理,如下图(testcases目录下包含build.xml和脚本文件) 3.查看Jenkins本地工作空 ...

  8. 九、Executor框架

    Executor框架 ​ 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1.5开始 ...

  9. 【前端词典】4 个实用有趣的 JS 特性

    前言 最近在学习的过程中发现了我之前未曾了解过的一些特性,发现有些很有趣并且在处理一些问题的时候可以给我一个新的思路. 这里我将这些特性介绍给大家. 4 个有趣的 JS 特性 利用 a 标签解析 UR ...

  10. 机器学习:weka源码在eclipse的配置和异常VerifyError的解决

    今天把weka源码导入eclipse,打算学习下weka源码,遇到一些问题,网上资料不足,自己总结下,希望为后来人铺路. 1)新建java项目,命名weka3-6 2)把weka-src.jar解压, ...