【Spring】重新认识 IoC
前言
IoC (Inversion of control) 并不是Spring特有的概念。
IoC
维基百科的解释:
In software engineering, inversion of control (IoC) is a programming principle. IoC inverts the flow of control as compared to traditional control flow.
在软件工程中,IOC(控制反转)是一种编程原则。和传统的控制流程相比,IoC颠倒了控制流程。
In IoC, custom-written portions of a computer program receive the flow of control from a generic framework.
在IoC中,程序的自定义编写部分接收一种来自通用框架的控制流程。
A software architecture with this design inverts control as compared to traditional procedural programming: in traditional programming, the custom code that expresses the purpose of the program calls into reusable libraries to take care of generic tasks, but with inversion of control, it is the framework that calls into the custom, or task-specific, code.
与传统的过程编程相比,采用这种设计的软件架构将控制反转:在传统编程中,表示程序目的的自定义代码调用可重用库来处理一般任务,但在控制反转中,框架调用自定义,或特定于任务的代码。
来源:https://en.wikipedia.org/wiki/Inversion_of_control
IoC的主要实现策略
由于自己确实对其他IoC容器了解不多,这儿的依赖查找和依赖注入只有以Spring来自我理解了。
由于Spring确实也是非常完善的IOC容器,所以理解完全没有问题。
依赖查找
为了便于理解,用Spring来举例,使用BeanFactory或者ApplicationContext的方法,如“getBeanByName”之类,来获取到我们托管到容器中的资源(如Bean),这个就是依赖查找。
依赖注入
为了便于理解,用Spring来举例,使用@Autowired来获取到我们托管到容器中的资源,这个就是依赖注入。
或者使用@Inject实现注入,@Inject是JSR330 (Dependency Injection for Java)中的规范,需要导入import javax.inject.Inject; 实现注入。
依赖查找 VS 依赖注入
| 类型 | 依赖处理 | 实现便利性 | 代码侵入性 | API依赖性 | 可读性 |
|---|---|---|---|---|---|
| 依赖查找 | 主动获取 | 相对繁琐 | 侵入业务逻辑 | 依赖容器API | 良好 |
| 依赖注入 | 被动提供 | 相对便利 | 低侵入性 | 不依赖容器API | 一般 |
注:这里所谓的主被动只是相对的,依赖注入也需要主动注入,但是其他的对象获取大部分被容器做了。
IoC容器的职责
通用职责
- 依赖处理
• 依赖查找
• 依赖注入 - 生命周期管理
• 容器
• 托管的资源(Java Beans 或其他资源)
容器的生命周期:容器的启动、运行、停止、销毁等生命周期管理。
托管的资源的生命周期:指容器管理的资源的注册,初始化,销毁等生命周期管理。
这里托管的资源不仅仅指JavaBean,因为Spring容器管理的资源还有:如Spring Event的Listener,它并不是一个Bean,也不是一个POJO。
- 配置
• 容器
• 外部化配置
• 托管的资源(Java Beans 或其他资源)
IoC容器的实现
IoC并不是Spring的专利,我之前一直认为Spring创造的IoC。实在是错了好多年。
主要实现
- Java SE
• Java Beans
• Java ServiceLoader SPI
• JNDI(Java Naming and Directory Interface) - Java EE
• EJB(Enterprise Java Beans)
• Servlet - 开源
• Apache Avalon(http://avalon.apache.org)
• PicoContainer(http://picocontainer.com)
• Google Guice(https://github.com/google/guice )
• Spring Framework(https://spring.io/projects/spring-framework )
基础IoC容器:JavaBeans
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.util.stream.Stream;
public class JavaBeansDemo {
public static void main(String[] args) throws IntrospectionException {
// stopClass 排除(截止)类
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class, Object.class);
// 属性描述符 PropertyDescriptor
// 所有 Java 类均继承 java.lang.Object
// class 属性来自于 Object#getClass() 方法
Stream.of(beanInfo.getPropertyDescriptors())
.forEach(propertyDescriptor -> {
// propertyDescriptor.getReadMethod(); // Getter 方法
// propertyDescriptor.getWriteMethod(); // Setter 方法
System.out.println(propertyDescriptor);
});
// 输出 User 定义的方法 MethodDescriptor
Stream.of(beanInfo.getMethodDescriptors()).forEach(System.out::println);
}
}
public class Person {
private String name;
private Integer age;
//getter setter
}
输出:
java.beans.PropertyDescriptor[name=age; propertyType=class java.lang.Integer; readMethod=public java.lang.Integer org.jamie.Person.getAge(); writeMethod=public void org.jamie.Person.setAge(java.lang.Integer)]
java.beans.PropertyDescriptor[name=name; propertyType=class java.lang.String; readMethod=public java.lang.String org.jamie.Person.getName(); writeMethod=public void org.jamie.Person.setName(java.lang.String)]
总结
这里的IOC整理是由于自己以前对IOC的误解,基于小马哥的讲解,自己的学习笔记。
我对IOC的理解是:
IOC最核心的功能:本来是我们主动控制一些资源,我们把这种控制权交给一种组件,这种组件可以帮我们管理这些资源,我们需要使用它的时候,从IOC容器中通过2种方式(依赖查找,依赖注入)来获取到资源。
【Spring】重新认识 IoC的更多相关文章
- Spring学习之Ioc控制反转(1)
开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...
- Spring学习之Ioc控制反转(2)
开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...
- 比Spring简单的IoC容器
比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring ...
- Spring学习笔记IOC与AOP实例
Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- Spring框架之IOC(控制反转)
[TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- Spring系列之IOC的原理及手动实现
目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 导语 Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有J ...
- Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)
Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...
- Spring框架中IoC(控制反转)的原理(转)
原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...
随机推荐
- Struts2 的 OGNL
ONGL简介: OGNL 的全称是对象图导航语言( Object-Graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可以通过某种表达式语法,存 ...
- shell脚本书写
#!/bin/bash #指定脚本默认使用的命令解释器 第1行 幻数 #!/usr/bin/python #!/bin/awk #!/bin/sed
- noip模拟40
\(\color{white}{\mathbb{名之以:海棠}}\) 考场 \(t1\) 看见题意非常简单,觉得可能是个简单题 暴力算出几个小样例右端点右移的时候左端点都是单调右移的,以为具有单调性, ...
- aes加解密后续问题contentType不是application/json时候后台解析请求对象request
一.post请求的三种content-type 1.application/x-www-form-urlencoded 主要用于如下:1.1: 最常见的POST提交数据方式.1.2:原生form默认的 ...
- 回收Windows 10恢复分区之后的磁盘空间
我电脑上安装了Windows 10和Linux双系统,现在将Linux删除之后,准备将其磁盘空间并入到Windows 10的C盘中,但是发现C盘跟Linux空间之间还隔了一个Windows的恢复分区, ...
- 小Z的袜子 & 莫队
莫队学习 & 小Z的袜子 引入 莫队 由莫涛巨佬提出,是一种离线算法 运用广泛 可以解决广大的离线区间询问题 莫队的历史 早在mt巨佬提出莫队之前 类似莫队的算法和莫队的思想已在Codefor ...
- Sentry 监控 - Environments 区分不同部署环境的事件数据
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- 配置Orchard Core 最新的包资源
添加预览包源 在本文中,我们将添加一个指向预览包的新包源. 与从主分支构建的NuGet上的代码相比,每次在dev分支上提交一些代码时都会构建预览包. 它们是最新的版本,但不是最稳定的,可以包含突破性的 ...
- Java面向对象系列(1)- 什么是面向对象
面向过程 & 面向对象 面向过程思想 步骤清晰清楚,第一步做什么,第二步做什么-- 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分 ...
- 腾讯云与 Grafana Labs 达成深度合作, 推出全新 Grafana 托管服务
9 月 23 日,腾讯云宣布与业界领先的开源数据可视化公司 Grafana Labs 达成深度合作协议,共同开发和验证全新的 Grafana 托管服务,通过 Grafana Labs 开源软件与腾讯云 ...