本文借鉴:Spring学习(特此感谢!)

一、简介

  概念:控制反转是一种通过描述(在 Java 中可以是 XML 或者注解)并通过第三方(Spring)去产生或获取特定对象的方式。(被动创建)

  优势:

  ① 降低对象之间的耦合

  ② 我们不需要理解一个类的具体实现,只需要知道它有什么用就好了(直接向 IoC 容器拿)

  小结:主动创建的模式中,责任归于开发者,而在被动的模式下,责任归于 IoC 容器,基于这样的被动形式,我们就说对象被控制反转了。(也可以说是反转了控制)

二、IOC容器

  Spring 会提供IoC 容器来管理和容纳我们所开发的各种各样的 Bean,并且我们可以从中获取各种发布在 Spring IoC 容器里的 Bean,并且通过描述可以得到它。

三、容器设计

  主要基于BeanFactoryApplicationContext 两个接口。

  BeanFactory 是 Spring IoC 容器所定义的最底层接口,而 ApplicationContext 是其最高级接口之一,并对 BeanFactory 功能做了许多的扩展,所以在绝大部分的工作场景下,都会使用 ApplicationContext 作为 Spring IoC 容器

  ApplicationContext的常用扩展类:

ClassPathXmlApplicationContext:从类路径下加载配置文件

FileSystemXmlApplication:从硬盘的绝对路径下加载配置文件

BeanFactory

常用方法

【getBean】对应了多个方法来获取配置给 Spring IoC 容器的 Bean。

按照类型拿 bean:

bean = (Bean) factory.getBean(Bean.class);

PS:要求在 Spring 中只配置了一个这种类型的实例,否则报错。(如果有多个那 Spring 就懵了,不知道该获取哪一个)

按照 bean 的名字拿 bean:

bean = (Bean) factory.getBean("beanName");

PS:这种方法不太安全,IDE 不会检查其安全性(关联性)

按照名字和类型拿 bean:(推荐)

bean = (Bean) factory.getBean("beanName", Bean.class);

【isSingleton】用于判断是否单例,如果判断为真,其意思是该 Bean 在容器中是作为一个唯一单例存在的。

【isPrototype】则相反,如果判断为真,意思是当你从容器中获取 Bean,容器就为你生成一个新的实例。

PS:在默认情况下,【isSingleton】为 ture,而【isPrototype】为 false

【getAliases】方法是获取别名的方法

ApplicationContext

1、先在【src】目录下创建一个 【bean.xml】 文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 通过 xml 方式装配 bean --><bean name="source" class="pojo.Source"><property name="fruit" value="橙子"/><property name="sugar" value="多糖"/><property name="size" value="超大杯"/></bean>
</beans>

PS:这里定义了一个 bean ,这样 Spring IoC 容器在初始化的时候就能找到它们,然后使用 ClassPathXmlApplicationContext 容器就可以将其初始化

2、使用 ClassPathXmlApplicationContext 容器将其初始化:

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Source source = (Source) context.getBean("source", Source.class);System.out.println(source.getFruit());
System.out.println(source.getSugar());
System.out.println(source.getSize());

四、ApplicationContext的常见实现类

ClassPathXmlApplicationCntext

读取classpath中的资源

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

FileSystemXmlApplicationContext

读取指定路径的资源

ApplicationContext ac = new FileSystemXmlApplicationContext("c:/applicationContext.xml");

XmlWebApplicationContext

需要在Web的环境下才可以运行

XmlWebApplicationContext ac = new XmlWebApplicationContext(); // 这时并没有初始化容器
ac.setServletContext(servletContext); // 需要指定ServletContext对象
ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 指定配置文件路径,开头的斜线表示Web应用的根目录
ac.refresh(); // 初始化容器

五、IOC初始化、注入的实现原理

Bean的定义

1、资源定位

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

2、获取Bean

这个时候只是将定位到的资源信息,保存到 Bean 定义(BeanDefinition)中,此时并不会创建 Bean 的实例。

3、注册Bean到IOC容器中

将定义好的Bean的信息发布到 Spring IoC 容器中

PS:做完了以上 3 步,Bean 就在 Spring IoC 容器中被定义了,但是没有被初始化,更没有完成依赖注入,此时它还不能完全使用。

Bean的初始化和注入

Spring IoC 默认会自动初始化 Bean

Spring Bean 还有一个配置选项——【lazy-init】,其含义就是是否初始化 Spring Bean

如果将其设置为 true,那么只有当我们使用 Spring IoC 容器的 getBean 方法获取它时,它才会进行 Bean 的初始化,完成依赖注入。

转载于:https://www.cnblogs.com/riches/p/11510981.html

Spring学习(四)IOC详解相关推荐

  1. Spring框架(二)Spring控制反转IoC详解

    目录 一,什么是Spring IoC容器 二,IoC有哪些优点 三,控制反转(IoC)有什么作用 四,IoC和DI有什么区别⭐ 五,Spring IoC的实现机制⭐ 六,IoC支持哪些功能 七,Bea ...

  2. Spring IoC详解

    Spring IoC详解 原文地址:Spring IoC详解 写在最前 本文将主要写Spring最核心的部分,为什么写这篇的原因也是因为在刚开始学习Spring的时候,学得太粗糙了.感觉学了个皮毛,从 ...

  3. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  4. Spring整合Schedule定时任务详解

    Spring整合Schedule定时任务详解 Spring 定时任务官方网站 一.概述 用Spring,就是为了简单. 但是我还是要总结下java定时任务实现的几种方式. 1.TimerTask,等于 ...

  5. Spring Boot 集成 FreeMarker 详解案例

    年轻就不应该让自己过得太舒服" – From yong 一.Springboot 那些事 SpringBoot 很方便的集成 FreeMarker ,DAO 数据库操作层依旧用的是 Myba ...

  6. 深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) By 李泽南2017年6月26日 15:57 本周一(6 月 19 日)机器之心发表文章《我的深度学习开发环境详解:Te

    深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) 机器之心 2017-06-25 12:27 阅读:108 摘要:参与:李泽南.李亚洲本周一(6月19日)机器之心发表文章<我的深 ...

  7. Spring包含JAR的详解

    一.Spring 常用包的说明 spring.jar :  包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and ...

  8. mysql dba系统学习-数据库事务详解

    mysql dba系统学习-数据库事务详解 上个星期去面试数据库管理员的工作,笔试通过之后就是直接的面试,他问了我一个问题,叫我介绍哈数据库的事务的看法和理解,但是不知所错的没有章法的乱答一气,唉唉, ...

  9. 【机器学习】集成学习及算法详解

    集成学习及算法详解 前言 一.随机森林算法原理 二.随机森林的优势与特征重要性指标 1.随机森林的优势 2.特征重要性指标 三.提升算法概述 四.堆叠模型简述 五.硬投票和软投票 1.概念介绍 2.硬 ...

  10. Spring EL表达式使用详解

    Spring EL表达式使用详解 什么是Spring EL表达式 注入字面值 注入操作系统(OS)的属性 注入properties配置文件中数据 Bean属性调用 Bean方法调用 T运算符 构造器 ...

最新文章

  1. Gym 100883J palprime(二分判断点在凸包里)
  2. JAVA SE学习day14:解析XML
  3. DHCP 服务大团圆
  4. Java多线程实现异步调用
  5. (原创)c++11中的日期和时间库
  6. oracle创建job权限
  7. router-LInk传参与接受参数(记录)
  8. 新手福音︱正则表达式小工具RegExr
  9. win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结
  10. mysql多实例访问代理_一台MySQL数据库启动多个实例
  11. [redis]redis五种数据类型和应用场景
  12. webpack5+vue3搭建h5项目模板-(一)-基础配置
  13. C#实现多功能记事本
  14. 串口-TCP调试助手
  15. 计算机盘符为什么没有AB盘
  16. 用了半年的时间,把python学到了能出书的程度
  17. 王牌特工:黄金圈 经典例句
  18. No.41-VulnHub-DEFCON Toronto: Galahad-Walkthrough渗透学习
  19. 爱肤宝医生产品负责人王照陆:大数据时代下的人工智能医疗
  20. 环境变量的作用,为什么要设置环境变量

热门文章

  1. xboxone硬盘坏的表现_【32期】硬盘损坏的根源居然是——它!
  2. Android Studio 导入应用时报错 Error:java.lang.RuntimeException: Some file crunching failed, see logs for de
  3. 每天一道LeetCode-----在给定数组中找到一个子数组,使得这个子数组的元素乘积最大
  4. 网站服务器挂了导致排名下降,常见关键词排名消失的原因及解决对策
  5. docker挂载本地文件
  6. 启动标志_牛股启动的标志:天衣无缝。
  7. 最后一块石头的重量II
  8. 如何关闭uefi启动模式|预装win8/win10电脑禁用uefi引导方法
  9. forward_list的insert操作
  10. c++ 输入输出流关联