目录

  • 一,什么是Spring IoC容器
  • 二,IoC有哪些优点
  • 三,控制反转(IoC)有什么作用
  • 四,IoC和DI有什么区别⭐
  • 五,Spring IoC的实现机制⭐
  • 六,IoC支持哪些功能
  • 七,BeanFactory和ApplicationContext有什么区别⭐
  • 八,ApplicationContext通常的实现是什么
  • 九,依赖注入的方式,构造器依赖注入和 Setter方法注入的区别⭐
  • 十,依赖注入的基本原则和优点

一,什么是Spring IoC容器

Spring是包含众多工具的IoC容器,控制反转即IoC,它有两个核心的功能:
①将对象(Bean)存储在容器(Spring)
②将对象(Bean)从容器(Spring)中取出来
【扩展:将对象存放到容器中的好处】
将对象存储在 IoC 容器相当于将以后可能⽤的所有工具制作好都放到仓库中,需要的时候直接取就行了,用完再把它放回到仓库。而new 对象的方式相当于,每次需要工具了,才现做,用完就扔掉了也不会保存,下次再用的时候还得重新做,这就是 IoC 容器和普通程序开发的区别

二,IoC有哪些优点

  • IOC 或 依赖注入把应用的代码量降到最低
  • 它使应用容易测试,单元测试不再需要单例和JNDI查找机制
  • 最小的代价和最小的侵入性使松散耦合得以实现
  • IOC容器支持加载服务时的饿汉式初始化和懒加载

三,控制反转(IoC)有什么作用

  • 将创建对象的控制权交给Spring的IoC,以前需要程序员自己控制对象创建,现在交给Spring的IoC创建,如果需要使用需要通过DI(依赖注入)@Autowired自动注入
  • 解耦,由容器去维护具体的对象,降低耦合度

【扩展:什么是解耦,代码示例】
解耦指的是解决了代码的耦合性,耦合性也可以换⼀种叫法叫程序相关性。这就好比我们打造⼀辆完整的汽车,如果所有的配件都是自己造,那么当客户需求发生改变的时候,比如轮胎的尺寸不再是原来的尺寸了,那我们要自己动手来改了,但如果我们是把轮胎外包出去,那么即使是轮胎的尺寸发生变变了,我们只需要向代理工厂下订单就行了,我们自身身是不需要出力的

  • 在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
  • 改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car
public class IocCarExample {public static void main(String[] args) {Tire tire = new Tire(20);Bottom bottom = new Bottom(tire);Framework framework = new Framework(bottom);Car car = new Car(framework);car.run();}//车类,把创建⼦类的⽅式,改为注⼊传递的⽅式static class Car {private Framework framework;public Car(Framework framework) {this.framework = framework;}public void run() {framework.init();}}//车身类static class Framework {private Bottom bottom;public Framework(Bottom bottom) {this.bottom = bottom;}public void init() {bottom.init();}}

四,IoC和DI有什么区别⭐

IoC:控制反转,由主动new产生对象(耦合过高)转换成从外部提供对象,就是将对象的创建控制权从程序转移到了外部
DI:依赖注入,就是在程序运行期间,自动的将一个对象从Spring拿出来给当前类使用

  • 区别:
    IoC 是“目标”也是⼀种思想,而目标和思想只是⼀种指导原则,而 DI 就是具体的实现
    例如:比如说我今天心情比较好,吃⼀顿好的犒劳犒劳自己,那么“吃⼀顿好的”是思想和目标(是 IoC),但最后我是吃海底捞,这就是具体的实现,就是 DI

五,Spring IoC的实现机制⭐

  • 1, 简单工厂:通过一个方法传入一个标识,生产对应对象
工厂模式案例:
public static void main(String[] arge){// 调用工厂方法,根据传入参数,返回一个对象BaseService  userService = Factory.getBean("user");
}
class Factory{public static BaseService getBean(String beanName){if("user".equals(beanName)){return = new UserServiceImpl();}if("role".equals(beanName)){return = new RoleServiceImpl();}}
}
  • 2,反射:反射就是在工厂模式getBean()方法中通过反射的方式来创建Bean
class Factory {public static Fruit getInstance(String ClassName) {Fruit f=null;try {f=(Fruit)Class.forName(ClassName).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}
}

【扩展:反射是什么,反射的实现原理】
反射机制是在运行的状态,对于任何一个类,都能知道所有属性和方法,对于任何一个对象都能调用任意方法属性,所以反射就是将Java类的各种成分映射成一个个对象

  • ①通过Class类的静态方法:forName(String className)(常用)获取Class对象
 try {Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象} catch (ClassNotFoundException e) {e.printStackTrace();}
  • ②通过反射获取构造方法并使用:
public class Student {//---------------构造方法-------------------//(默认的构造方法)Student(String str){System.out.println("(默认)的构造方法 s = " + str);}//无参构造方法public Student(){System.out.println("调用了公有、无参构造方法执行了。。。");}//有一个参数的构造方法public Student(char name){System.out.println("姓名:" + name);}//有多个参数的构造方法public Student(String name ,int age){System.out.println("姓名:"+name+"年龄:"+ age);//这的执行效率有问题,以后解决。}//受保护的构造方法protected Student(boolean n){System.out.println("受保护的构造方法 n = " + n);}//私有构造方法private Student(int age){System.out.println("私有的构造方法   年龄:"+ age);}}

六,IoC支持哪些功能

Spring 的 IoC 设计支持以下功能:

  • 依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 指定初始化方法和销毁方法
  • 支持回调某些方法(但是需要实现 Spring 接口,略有侵入)
    其中,最重要的就是依赖注入,从 XML 的配置上说,即 ref 标签。对应 Spring RuntimeBeanReference 对象。
    对于 IoC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入
    【扩展:解释Bean周期】下篇博客详细介绍

七,BeanFactory和ApplicationContext有什么区别⭐

首先创建Spring上下文的时候,会使用BeanFactory和ApplicationContext两种方法

//先得到Spring上下文ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");//配置文件对应
 // 先得到 spring 获取 bean 的对象BeanFactory beanFactory =new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
  • 共同点:BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口
  • 区别:
    ①继承关系和功能:ApplicationContext是BeanFactory的子类,BeanFactory只是提供了基础操作Bean的方法,ApplicationContext除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持,资源访问⽀持等
    ②性能:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,而 BeanFactory是需要那个才去加载那个,因此更加轻量

八,ApplicationContext通常的实现是什么

  • FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数
  • ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置
  • WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean

九,依赖注入的方式,构造器依赖注入和 Setter方法注入的区别⭐

  • 依赖注入是时下最流行的IoC实现方式,依赖注入分为接口注入,Setter方法注入,和构造器注入,三种方式。其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃
  • 一、构造器注入
    将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。优点:对象初始化完成后便可获得可使用的对象。
    缺点:当需要注入的对象很多时,构造器参数列表将会很长;不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦
  • 二、setter方法注入
    lOC Service Provider通过调用成员变量提供的setter函数将被依赖对象注入给依赖类优点:灵活,可以选择性地注入需要的对象
    缺点:依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用
  • 三、接口注入
    依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象
    优点:接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。缺点:侵入行太强,不建议使用
    【扩展:什么是侵入性?】
    如果类A要使用月别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性
    区别:

十,依赖注入的基本原则和优点

  • 依赖注入的基本原则:
    应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IoC容器负责。容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造器传递给需要的对象
  • 优势:
    ①查找定位操作与应用代码完全无关
    ②不依赖于容器的API,可以很容易地在任何容器以外使用应用对象
    ③不需要特殊的接口,绝大多数对象可以做到完全不必依赖容器

Spring框架(二)Spring控制反转IoC详解相关推荐

  1. PHP依赖注入(DI)和控制反转(IoC)详解

    这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...

  2. 【Spring】Spring第一天 - 环境搭建、IoC 详解、DI 详解等

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

  3. Spring教程--IOC(控制反转)详解

    IOC装配Bean 1.1 Spring框架Bean实例化的方式 提供了三种方式实例化Bean. * 构造方法实例化:(默认无参数) * 静态工厂实例化: * 实例工厂实例化: 1.1.1 无参数构造 ...

  4. Spring框架中的控制反转和依赖注入

    控制反转: 控制反转是用来降低代码之间的耦合度的,基本思想就是借助"第三方"实现具有依赖对象的解耦. 为什么需要控制反转,因为项目中对象或多或少存在耦合.控制反转的关键在于Ioc容 ...

  5. Spring(二)控制反转

    控制反转是Spring框架的核心,用来消减计算机程序的耦合问题.依赖注入是IoC的另一种方法,只是从不同的角度上来描述的. 通过·面向对象思想讨论控制反转和依赖注入两个概念. 当某个java对象(调用 ...

  6. spring框架使用Quartz执行定时任务实例详解

    版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介 1.Qua ...

  7. spring框架学习笔记2:配置详解

    简单写一个类做示例: package bean;public class User {private String name;private Integer age;public String get ...

  8. 浅析Spring——控制反转IoC

    目录 1. IoC理论推导 2. 什么是IoC? 3. 引入DI 4. IoC容器 5. 注入对象的四种方法 1.基于接口 2.基于setter 3.基于构造函数 4.基于注解 6. 两种IoC实现方 ...

  9. Spring 概念及特点 Spring下载地址 控制反转IoC实现原理

    Spring下载地址 http://repo.springsource.org/libs-release-local/org/springframework/spring/ Spring是开源full ...

最新文章

  1. Android Studio 使用感受 错误解决
  2. python识别文字并且提示_python脚本:检测字符串标识符
  3. 201521123091 《Java程序设计》第3周学习总结
  4. 性能测试工具_磁盘性能测试工具fio
  5. 问题:二进制数中1的个数。
  6. Darkness Before the Dawn
  7. 如何获取FragmentTabHost中指定标签页的Fragment
  8. 编译安装 openswan-2.6.34
  9. mysql批量导入已经格式好的文本数据
  10. Largest Number(leetcode 179)
  11. NLP 算法工程师的学习、成长和实战经验
  12. 如何利用ansible callback插件对执行结果进行解析
  13. 数据同步工具之DataX理论
  14. 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
  15. struts2 数据校验
  16. oracle第五章多表连接习题答案(理解+剖析)
  17. 心脏骤停患者数据统计系统
  18. 计算机科学与技术专业考数媒,数字媒体技术考研考什么
  19. 手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心
  20. 企业内网安全建设的全面解析

热门文章

  1. xp系统访问不了共享服务器,Win7与Vista、XP等老系统无法互相访问共享
  2. 怎么将手机上保存的CAD图纸发送给好友
  3. Linux uart 驱动
  4. 如何快速释放C盘空间
  5. 每周最佳Android应用( 2011年2月14日至22日 )
  6. 一辈子假积极就是真积极
  7. Nature综述:Rob Knight等大佬手把手教你开展菌群研究
  8. Android 64位系统和32位的兼容性分析
  9. nodeBB和flarum个人搭建过程记录
  10. 类名称空间,查询顺序,组合