Spring框架(二)Spring控制反转IoC详解
目录
- 一,什么是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详解相关推荐
- PHP依赖注入(DI)和控制反转(IoC)详解
这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...
- 【Spring】Spring第一天 - 环境搭建、IoC 详解、DI 详解等
一.Spring 框架简介及官方压缩包目录 介绍 1.主要发明者:Rod Johnson 2.轮子理论推崇者: 2.1 轮子理论:不用重复发明轮子. 2.2 IT 行业:直接使用写好的代码. 3.Sp ...
- Spring教程--IOC(控制反转)详解
IOC装配Bean 1.1 Spring框架Bean实例化的方式 提供了三种方式实例化Bean. * 构造方法实例化:(默认无参数) * 静态工厂实例化: * 实例工厂实例化: 1.1.1 无参数构造 ...
- Spring框架中的控制反转和依赖注入
控制反转: 控制反转是用来降低代码之间的耦合度的,基本思想就是借助"第三方"实现具有依赖对象的解耦. 为什么需要控制反转,因为项目中对象或多或少存在耦合.控制反转的关键在于Ioc容 ...
- Spring(二)控制反转
控制反转是Spring框架的核心,用来消减计算机程序的耦合问题.依赖注入是IoC的另一种方法,只是从不同的角度上来描述的. 通过·面向对象思想讨论控制反转和依赖注入两个概念. 当某个java对象(调用 ...
- spring框架使用Quartz执行定时任务实例详解
版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介 1.Qua ...
- spring框架学习笔记2:配置详解
简单写一个类做示例: package bean;public class User {private String name;private Integer age;public String get ...
- 浅析Spring——控制反转IoC
目录 1. IoC理论推导 2. 什么是IoC? 3. 引入DI 4. IoC容器 5. 注入对象的四种方法 1.基于接口 2.基于setter 3.基于构造函数 4.基于注解 6. 两种IoC实现方 ...
- Spring 概念及特点 Spring下载地址 控制反转IoC实现原理
Spring下载地址 http://repo.springsource.org/libs-release-local/org/springframework/spring/ Spring是开源full ...
最新文章
- Android Studio 使用感受 错误解决
- python识别文字并且提示_python脚本:检测字符串标识符
- 201521123091 《Java程序设计》第3周学习总结
- 性能测试工具_磁盘性能测试工具fio
- 问题:二进制数中1的个数。
- Darkness Before the Dawn
- 如何获取FragmentTabHost中指定标签页的Fragment
- 编译安装 openswan-2.6.34
- mysql批量导入已经格式好的文本数据
- Largest Number(leetcode 179)
- NLP 算法工程师的学习、成长和实战经验
- 如何利用ansible callback插件对执行结果进行解析
- 数据同步工具之DataX理论
- 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
- struts2 数据校验
- oracle第五章多表连接习题答案(理解+剖析)
- 心脏骤停患者数据统计系统
- 计算机科学与技术专业考数媒,数字媒体技术考研考什么
- 手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心
- 企业内网安全建设的全面解析