Spring IoC概念:

IoC 概念
应用控制反转,对象在创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。
控制反转(Inversion of Controll)是一个重要的面向对象编程的法则,来削弱计算机程序的耦合问题,也是轻量级 Spring 框架的核心。
控制反转一般分为两种类型,依赖注入(Dependency Injection,DI)和依赖查找(Dependency Lookup),依赖注入应用广泛。
深入分析
依赖于谁?应用程序依赖于 IoC 容器
为什么要依赖?应用程序需要 IoC 容器来提供对象需要的外部资源
谁注入谁?IoC容器注入应用程序某个对象,应用程序依赖的对象
注入了社么?注入某个对象所需要的外部资源(包括对象、资源、常量对象)
与new对象的区别
正转与反转,传统应用程序是由我们将自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮助创建及注入依赖对象。
IoC优缺点
优点:实现组件之间的解耦,提供程序的灵活性和可维护性
缺点:对象生成因为是使用反射编程,在效率上有损耗

IoC 容器

概念:
在每个框架中都有一个容器的概念,所谓的容器就是将常用的服务封装起来,然后,用户只需要遵循一定的规则,就可以达到统一、灵活、安全、方便、快速的目的
具有依赖注入功能的容器,负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖
Bean的概念:
由IoC容器管理的那些组成应用程序的对象就叫Bean
Bean就是由Spring容器初始化、装配及管理的对象,除此之外,Bean就与应用程序中的其他对象没什么区别了
元数据 BeanDefinition
确定如何实例化Bean、管理Bean之间的依赖关系及管理Bean,就需要配置元数据,在Spring中由BeanDefintion代表
如何工作(以XML配置方式解释)
准备配置文件:配置文件中声明 Bean 定义也就是 Bean 配置元数据。
由 IoC 容器进行解析元数据:IoC 容器的 Bean Reader 读取并解析配置文件,根据定义生成 BeanDefintion 配置元数据对象,IoC 容器根据 BeanDefintion 进行实例化、配置及组装 Bean。
实例化 IoC 容器:由客户端实例化容器,获取需要的 Bean。

Spring IoC 初始化

三种注入方式

在Spring框架中,依赖注入(DI)的设计模式是用来定义对象彼此间的依赖。使用xml配置bean的情况下,它主要有两种类型:

  • Setter 方法注入
  • 构造器注入
  • 注解 @autowired

当然,有了注解之后,使用注解的方式更加方便快捷。即自动装配功能实现属性自动注入(@autowire)。

原理解析:

当运行 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
构造方法 ClassPathXmlApplicationContext(String configLocation), 调用了 this(new String[] {configLocation}, true, null); 该构造方法具体代码:【ClassPathXmlApplicationContext构造方法】:

/**
* 在 parent 下创建 ClassPathXmlApplicationContext,
* 从 XML 中读取素有 Bean 定义。
* @param configLocations 配置文件路径如 c:simpleContext.xml
* @param refresh 是否需要自动刷新 context,refrest--> 重新加载
* 加载所有的 bean 定义,创建所有单例。
* refresh 为 true 的时候,根据 context 来手工刷新
* @param parent the parent context
* @throws BeansException if context creation failed
* @see #refresh()
*/
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)     throws BeansException{// 初始化XmlApplicationContextsuper(parent);// 转换配置文件的路径setConfigLocations(configLocations);if(refresh) {// 重新刷新所有的 context,这一篇的重点refresh();}
}

【refresh方法】:

/**
* 加载或刷新持久的配置,可能是xml文件,properties文件,或者关系型数据库的概要。
* 作为一启动方法,如果初始化失败将会销毁已经创建好的单例,避免重复加载配置文件。
* 换句话说,在执行这个方法之后,要不全部加载单例,要不都不加载。
public void refresh() throws BeansException, IllegalStateException {synchronized(this.startupShutdownMonitor) {// 初始化配置准备刷新,验证环境中的一些必选参数prepareRefresh();// 告诉继承销毁内部的 factory创建新的 factory 实例// 初始化 Bean 实例ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 初始化 beanFactory 的基本信息,包括 classLoader、environment、忽略的注解等。prepareBeanFactory(beanFactory);try {// beanFactory 内部的 postProces,可以理解为 context 中的 PostProcess 的补充beanFactory.postProcessBeanFactory(beanFactory)p;// 执行 BeanFactoryPostProcessor(在beanFactory)初始化过程中,bean 初始化之前,修改BeanFactory 参数// BeanDefinitionRegistryPostProcessor 其实也是继承自 BeanFactoryPostProcessor,// 多个对 BeanDefinitionRegistry 的支持 invokeBeanFactoryPostProcessors(beanFactory)// 执行 postProcess,那 BeanPoseProcessor 是什么呢,是为了在 bean 加载过程中修改 bean 的内容,// 使用Before、After分别对应初始化前和初始化后registerBeanPostProcessors(beanFactory);// 初始化 MessageSource,主要用于 I18N 本地化的内容initMessageSource();// 初始化事件广播 ApplicationEventMulticaster,使用观察者模式,对注册的 ApplicationEvent 时间进行捕捉initApplicationEventMulticaster();// 初始化特殊的 bean 方法onRefresh();// 将所有 ApplicationEventListener 注册到 ApplicationEventMulticaster 中registerListeners();// 初始化所有部位 lazy-init 的bean,singleton 实例finishBeanFactoryInitialization(beanFactory);// 初始化 lifeCycle 的bean启动(例如 quartz 的定时器),如果开启 JMX 则将 ApplicationContext 注册到上面finishRefresh();} catch(BeansException ex) {// 销毁已经创建单例resources.destroyBeans();// 将 context 的状态转换为无效,标示初始化失败flag.cancelRefresh(ex);}}
}

转自: java思维导图

c# ioc 单例模式_Spring-IOC相关推荐

  1. java ioc 原理_Spring IoC原理

    Spring IoC(DI)是Spring框架的核心,所有对象的生命周期都是由它们来管理.对于弄懂Spring IOC是相当关键,往往我们第一次接触Spring IOC大家都是一头雾水.当然我们这篇文 ...

  2. c# ioc 单例模式_C# IOC 控制反转

    说明:需要引用using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.Configuration; 两个企业库,using Sy ...

  3. java中ioc作用_Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?

    这里是修真院后端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析后端知识/技能,本篇分享的是: [Spring中 ...

  4. AOP之PostSharp7-解决IOC 不能直接new问题,简化IOC开发和IOC对象LazyLoad

    经过几节的postsharp基础和每节的一个应用实例,已经基本PostSharp应用的能力,PostSharp主要是简化我们的开发,让编译器时候给我注入重复疲劳代码. 在今天我们的demo是,关于io ...

  5. 依赖注入的三种方式_Spring IoC是如何进行依赖注入的

    依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码.而Spring IoC这个思想的 ...

  6. ioc中最基本的JAVA技术_Spring IOC 知识点总结

    广义的 IOC 在这之前,我们先记住一句话.好莱坞原则:Don't call me, we will call you. 即"不用打电话过来,我们会打给你". 控制反转(Inver ...

  7. java di是什么_Spring IOC和DI的理解有什么区别

    (1)Spring是一个解决了许多在J2EE开发中常见的的问题的强大框架. (2)Springle提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的好习惯. (3)Spring的架构 ...

  8. java spring ioc 实例_Spring 源码阅读(IOC容器)-bean的实例化以及注入

    3.Bean的实例化以及注入过程分析 Bean的实例以及注入是在getBean时触发的,由于外部容器是与外部调用交互的桥梁,我们首先从外部容器入手,AbstractApplicationContext ...

  9. ioc spring 上机案例_抛开Spring去理解IOC思想 - 原来IOC容器这么简单

    很多小伙伴们看到标题可能就会想到抛开Spring就不会存在IOC思想了,其实不然在接下来的文章中就会讲述到. 很多小伙伴在理解IOC的时候通常会和Spring放到一起去学习,首先呢Spring设计的非 ...

最新文章

  1. java 短信平台_Java通过SMS短信平台实现发短信功能
  2. 赵本山:我的时代还没有结束 | Python告诉你
  3. 幼儿课外活动游戏_幼儿园的户外活动游戏有哪些?
  4. 以太坊钱包开发系列3 - 展示钱包信息及发起签名交易
  5. SAP Hybris backoffice加载的zul文件和zk文件是什么东西
  6. 【现代程序设计】【homework-07】
  7. [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
  8. 自来水供水收费管理系统
  9. IEEE会议文章接收后提交流程
  10. excel英文自动翻译成中文教程
  11. 从辣条国家标准到 java 接口规范
  12. Seaweed-fs
  13. 【视听盛宴】《高效能人士的七个习惯》分享会
  14. vue如何返回上一页效果
  15. Maven插件wagon-maven-plugin自动化部署Java项目到Linux远程服务器
  16. 有什么性价比高的蓝牙耳机?2022三八节适合送礼的蓝牙耳机品牌推荐
  17. (翻译)A Deep Learning-Based Approach to Progressive Vehicle Re-identification for Urban Surveillance
  18. VINS-Mono中的边缘化与滑窗 (2)—— 边缘化最老帧
  19. python-opencv 第三讲 形态学处理
  20. JavaSE - 继承

热门文章

  1. C#实现HTTP协议:多线程文件传输
  2. 网络编程中的超时检测
  3. qq2440 cs8900移植
  4. Android笔记之模拟器
  5. 11.20 yum:自动化RPM包管理工具
  6. linux mail.rc 端口,配置mail.rc 文件并使用mail发送邮件的详细配置
  7. Chino with Geometry(数学,计算几何,记录一下推导证明)
  8. 干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径
  9. 阿里云 OpenAPI 开发者门户全新上线
  10. 喝酒撸串聊技术!来看云栖大会15位大咖真人秀