IOC简介

IoC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”。

使用IOC容器创建对象我们只需要通过配置来告诉它需要创建的对象是什么,并标识一下以后使用什么来获取IOC容器中创建好的对象即可(配置使用IOC的过程),这时候等你想要IOC容器中对象就直接用这个唯一标识来获取就好,而获取的过程肯定是IOC通过这个唯一标识来查找并返回给我们该对象

通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。比如:Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。在使用了IOC之后呢?A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(xml)来指定既然由配置文件来指定创建对象关系,就大大降低了各个组件之间的强耦合并有利于维护,是项目变得更加稳健灵活

Spring IOC原理

Bean缓存池:HashMap实现

Spring IOC容器介绍(依赖注入

Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化 Bean 并建立 Bean 之间的依赖关系。 Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。

  • BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;
  • ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合我们都直接使用 ApplicationContext 而非底层的 BeanFactory。

BeanFactory

  • XmlBeanFactory 通过 Resource 装载 Spring 配置信息并启动 IoC 容器,然后就可以通过 BeanFactory#getBean(beanName)方法从 IoC 容器中获取 Bean 了。通过 BeanFactory 启动IoC 容器时,并不会初始化配置文件中定义的 Bean,初始化动作发生在第一个调用时。
  • 对于单实例( singleton)的 Bean 来说,BeanFactory会缓存 Bean 实例,所以第二次使用 getBean() 获取 Bean 时将直接从 IoC 容器的缓存中获取 Bean 实例。Spring 在 DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用HashMap 实现的缓存器,单实例的 Bean 以 beanName 为键保存在这个HashMap 中。
  • 值得一提的是,在初始化 BeanFactory 时,必须为其提供一种日志框架,比如使用Log4J, 即在类路径下提供 Log4J 配置文件,这样启动 Spring 容器才不会报错。

ApplicationContext

ApplicationContext 由 BeanFactory 派生而来,提供了更多面向实际应用的功能。

在BeanFactory 中,很多功能需要以编程的方式实现,而在 ApplicationContext 中则可以通过配置的方式实现。

ApplicationContext 继承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,在此基础上,还通过多个其他的接口扩展了 BeanFactory 的功能:

  • ClassPathXmlApplicationContext:默认从类路径加载配置文件
  • FileSystemXmlApplicationContext:默认从文件系统中装载配置文件
  • ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等。实现了 ApplicationListener 事件监听接口的 Bean 可以接收到容器事件 , 并对事件进行响应处理 。 在 ApplicationContext 抽象实现类AbstractApplicationContext 中,我们可以发现存在一个 ApplicationEventMulticaster,它负责保存所有监听器,以便在容器产生上下文事件时通知这些事件监听者。
  • MessageSource:为应用提供 i18n 国际化消息访问的功能;
  • ResourcePatternResolver : 所 有 ApplicationContext 实现类都实现了类似于PathMatchingResourcePatternResolver 的功能,可以通过带前缀的 Ant 风格的资源文件路径装载 Spring 的配置文件。
  • LifeCycle:该接口是 Spring 2.0 加入的,该接口提供了 start()和 stop()两个方法,主要用于控制异步处理过程。在具体使用时,该接口同时被 ApplicationContext 实现及具体 Bean 实现, ApplicationContext 会将 start/stop 的信息传递给容器中所有实现了该接口的 Bean,以达到管理和控制 JMX、任务调度等目的。
  • ConfigurableApplicationContext 扩展于 ApplicationContext,它新增加了两个主要的方法: refresh()和 close(),让 ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用 refresh()即可启动应用上下文,在已经启动的状态下,调用 refresh()则清除缓存并重新装载配置信息,而调用close()则可关闭应用上下文。这些接口方法为容器的控制管理带来了便利,但作为开发者,我们并不需要过多关心这些方法。

Spring 3.0 支持基于类注解的配置方式,主要功能来自于 Spring 的一个名为 JavaConfig 子项目,目前 JavaConfig已经升级为 Spring核心框架的一部分。

ApplicationContext 在初始化应用上下文时就实例化所有单实例的 Bean。

Bean的生命周期

IOC容器工作机制

  • Spring IOC容器主要有继承体系底层的BeanFactory、高层的ApplicationContext和WebApplicationContext
  • Bean有自己的生命周期
  • 容器启动原理:Spring应用的IOC容器通过tomcat的Servlet或Listener监听启动加载;Spring MVC的容器由DispatchServlet作为入口加载;Spring容器是Spring MVC容器的父容器
  • 容器加载Bean原理:
  1. BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中;
  2. 容器扫描BeanDefinitionRegistry中的BeanDefinition;调用InstantiationStrategy进行Bean实例化的工作;使用BeanWrapper完成Bean属性的设置工作;
  3. 单例Bean缓存池:Spring 在 DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用 HashMap 实现的缓存器,单实例的 Bean 以 beanName 为键保存在这个HashMap 中。

Spring常用的依赖注解

声明 含义
@Component  声明注入Spring容器,当前类是组件
@Service   当前类在业务逻辑层使用
@Repositorty  当前类在数据访问层使用
@Controller 当前类在展现层控制器层使用

以上四种声明方式依赖效果完全一致,使用不同的关键词是为了给阅读的人能够快速了解该类属于哪一层,不同的注解也有一些独立的配置。

Spring常用的注入注解

声明 含义
@Autowired  Spring为这个变量注入一个Bean
@Inject    翻译为“注入”最易懂的注入注解
@Resource  翻译为“资源”,可以理解为Spring往里面注入的时一个资源

以上几种注入方式也大同小异。

总结

这部分的内容比较枯燥,主要是了解IOC思想及Spring实现IOC内部的一些机制,还有Spring IOC常用的依赖注入的注解,希望本文对大家有些帮助~~

Spring Ioc原理及解析相关推荐

  1. Spring Ioc原理解析

    Spring Ioc原理解析 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦 ...

  2. Spring IOC 原理解析

    Spring IOC 原理 ? IOC DI(依赖注入) **DI注入的几种方式** IOC容器 IOC原理 要想理解IOC,就需要知道一下IOC.DI 和IOC容器都是干什么的 IOC spring ...

  3. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  4. Spring IOC 原理

    Spring IOC原理 IOC理解 自己写的简单的IOC容器 IOC的原理 定位.加载.注册 基于XML配置的IOC容器初始化 1.寻找入口 2.获取配置路径 3.开始启动 4.创建容器 5.载入配 ...

  5. Spring:源码解读Spring IOC原理

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是Ioc/DI? IOC容器:主要是完成了 完成对象的创建和依赖的管理注入等. 先从我们自己设计这样一个视角来考虑: ...

  6. 解析Spring IOC原理——工厂模式与反射机制的综合应用

    (一)工厂模式 从一个例子开始讲起: 首先我们建立一个Chinese.java类,该类的sayHelloWorld(String name)方法,用中文对名为name的人问好,其内容如下: [java ...

  7. Spring IOC原理 Bean标签解析和Definition封装

    以下源码版本是 Spring 5.2.x IOC Inversion of Control 控制反转,关键实现是DI Dependency Injection,就必然涉及到有一个容器保存系统中所有托管 ...

  8. spring ioc原理解析

    概述 Spring IOC控制反转,分为两个方面解释: 控制:对象对于内部成员的控制 反转:将之前对象管理自己内部成员,转变为ioc容器管理,目的是接耦 IOC的好处是: 无需手动创建,拿来就用 享受 ...

  9. Spring IOC原理总结

    Spring容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系 ...

最新文章

  1. 重庆python就业工资待遇-重庆Python人工智能编程
  2. Windows下配置R-FCN
  3. 字符串处理:布鲁特--福斯算法
  4. jzoj4020-Revolution【网络流,最小割】
  5. mybatis常用方法总结
  6. 一名亚马逊软件工程师的辛酸苦楚
  7. 排序构造 GYM 101149 F - The Weakest Sith
  8. NetBeans 时事通讯(刊号 # 120 - Oct 14, 2010)
  9. swift拖放的按钮如何在后台设置点击事件 www.cnblogs.com/foxting/p/SWIFT.html
  10. 大学四年零基础自学Java的路线
  11. MySQL数据库报错:no database selected
  12. QQ号被盗有什么方法能找回
  13. Compose 实现页面侧滑返回
  14. 杭州的海王星辰将健美生的保健品全部突然下架拉,有谁知道是什么
  15. BI报表工具--实现财务数据可视化分析
  16. python cookie动态请求_Python请求自动处理cookie
  17. aardio工程实例——MIDI音乐盒(源码)
  18. 上海大学计算机跨考限制,注意:跨考专业有限制!这些你必须要了解!
  19. 今年的目标 --还有两个月 我的21天计划
  20. 奥比中光Femto相机环境配置

热门文章

  1. HashTable和HashMap的区别
  2. Android获取通话记录的未接来电、自定义通知栏事件处理
  3. 出现身份验证错误,无法连接到本地安全机构
  4. 网页版阴阳师与服务器断开、,阴阳师服务器崩了怎么回事?阴阳师服务器崩了怎么解决...
  5. 【Android】自定义view之onMeasure
  6. 使用C#调用windows API
  7. 第十六期|善网ESG周报:互联网公益高质量发展正当时
  8. python:基金净值与龙头股收盘价 数据的相关性分析
  9. 【NOIP模拟】幻象
  10. PS教程!手把手教你打造复古几何无缝纹理背景