SpringBoot中的IoC
SpringBoot中的IoC
(原创内容,转载请注明来源,谢谢)
一、Spring IoC
IoC又称为依赖反转,有两种方式,一种是DI(依赖注入),另一种是DL(依赖查找)。DI是当前实体被动依赖其他组件的IoC注入,DL是当前实体主动注册某个服务。
典型的Spring IoC方式如下:
ApplicationContextcontext = new FileSystemXmlApplicationContext(....);
MockServiceservice = context.getBean(MockService.class);
service.doSomething();
其中第二行的context.getBean就属于DL的过程,即主动去加载某个服务。但是构建IoC容器的背后,更多的是DI。
1、Spring IoC DI流程
1)收集和注册
第一阶段是构建和收集Bean,通常通过XML或者java代码的方式进行构建和定义。
2)分析和组装
收集和注册后,每个Bean都是一个独立的个体,则需要在这个阶段将每个bean联系起来,如果bean之间有依赖关系的,还需要进行依赖。
早期Spring可以通过xml进行此工作,但是Springboot中,更趋向于使用Annotation的方式,即@注解的方式。
2、Java Config
基于Java Config的方式,即对Annotation的完美实现。
1)表达形式层面
对于以前复杂的bean的xml的配置,现在可以用注解的方式来实现。对于定义一个类作为javaconfig,只需要在类的上方加上@Configuration,即将其定义成一个bean。
例如:
@Configuration
public class TestConfiguration{
//bean定义
}
2)注册bean定义层面
对于备注了Configuration内部的方法,加上@Bean,则将其标注成bean,其返回值将作为一个bean注册到Spring IoC容器,方法名默认称为该bean定义的id。
例如对于上述class,其中的某个类:
@Bean
publicTestService testService(){
return new TestServiceImpl();
}
3)表达依赖注入层面
对于某个bean,如果依赖于其他的bean,则只需要在该方法返回值的new构造方法中,传入所依赖的bean对应的方法即可。
例如对于上述方法,如果有一个方法依赖上述方法,则:
@Bean
publicDependencyService dependencyService(){
return new DependencyServiceImpl(testService());
}
4)优化
对于多个bean互相依赖,对于同一个类,并不会产生多个实例。
Spring boot通过拦截配置类避免多次初始化某个类。对于bean的依赖,会先查看拦截配置类是否已经实例化过该类,只有在没有实例化过该类的情况下,才会请求父类的同一方法来实现实例化。
——written by linhxx 2017.09.22
- [WCF REST] Web消息主体风格(Message Body Style)
- apache配置https服务
- [WCF 4.0新特性] 默认绑定和行为配置
- mysql数据库及django用户名启用中文的方法
- 【学习笔记】先行者课程0109-rotate3d_变量、堆、栈
- 通过WCF扩展实现消息压缩
- Linux系统中的信号量机制
- 基于Linux与lpc3250开发板的交叉开发环境搭建
- WCF中关于可靠会话的BUG!!
- [WCF安全系列]谈谈WCF的客户端认证[Windows认证]
- ls命令实现分析
- [WCF安全系列]谈谈WCF的客户端认证[X.509证书认证]
- Openstack Trove概要
- [WCF安全系列]实例演示:TLS/SSL在WCF中的应用[SSL over TCP]
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Rancher2.4.3 Rest API修改镜像地址
- Python UNIX系统管理指南
- 聊聊dubbo-go的ConsistentHashLoadBalance
- Tacotron2运行笔记
- 小米底包
- 新特性解读 | GROUPING() 函数用法解析
- 给我1万字,也讲Java不清内存排查。1万不行来2万~.~
- Typescript 设计模式之工厂方法
- vue中获取外网IP的方法
- WPF图片处理相关
- WPF文件压缩
- 如何实现SAP WebClient UI附件批量上传
- Python基础教程
- 使用Source Monitor检测Java代码的环复杂度
- 使用Source Monitor检测Java代码的环复杂度