理解Spring中的IoC和DI
什么是IoC和DI
IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。
DI(Dependence Injection 依赖注入):将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。
- 控制反转是一种思想
- 依赖注入是一种设计模式
- IoC框架使用依赖注入作为实现控制反转的方式
为什么需要
在没有IoC之前,我们要在A类中使用B类,就要在A类中new出B类的实例,这样A类和B类之间就出现了耦合。
public class A {
private B b = new B();
}
使用了IoC之后,我们就把实例化这样操作交给框架去帮我们做了。
Spring 中的IoC
容器是Spring的核心,Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系。
Spring容器并不是只有一个,Spring自带多个容器的实现,可以归纳为两种不同的类型:
- bean工厂(
BeanFactory),最简单的容器,提供基本的DI支持。 - 应用上下文(
ApplicationContext),继承了BeanFactory,并提供应用框架级别的服务。
作为开发人员,我们需要告诉Spring哪些对象要作为bean装配到容器中,bean和bean之间的依赖关系。Spring提供了三种主要的装配机制:
- 隐式的bean发现机制和自动装配
- 在Java中进行显示配置
- 在XML中进行显示配置
下面我们逐一介绍这三种机制。
自动装配bean
组件扫描:spring会自动发现应用上下文中所创建的bean
@Component 注解表明该类会作为组件类,并告知Spring要为这个类创建bean。
@Component
public class Dog {
}
@ComponentScan 注解启用了组件扫描。
@Configuration
@ComponentScan
public class DemoApplication {
}
自动装配:Spring自动满足bean之间的依赖
@Autowired 注解可以作用在构造器、方法、属性上。
@Component
public class Dog {
// 属性
@Autowired
private Cat cat;
// 构造器
// 从Spring 4.3开始,具有单个构造函数的类可以省略@Autowired注释
@Autowired
public Dog(Cat cat) {
this.cat = cat;
}
// 方法
@Autowired
public void setCat(Cat cat) {
this.cat = cat;
}
}
在Java中装配bean
组价配置:声明一个配置类,并在配置类中配置bean
@Configuration 注解表明这个类是配置类,我们可以在配置类下创建bean。
@bean 注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring上下文中的bean。
/**
* 普通类
*/
public class BaseBean {
public void p() {
System.out.println("Hello bean");
}
}
/**
* 配置类
*/
@Configuration
public class BeanConfig {
// 这个方法返回一个对象,Spring会把这个对象注册为bean
@Bean
public BaseBean getBaseBean() {
return new BaseBean();
}
}
组件注入:在配置类中把被依赖的组件注入另一个组件中
两种方式注入bean:
- 我们可以直接调用
get方法,获取到对应的组件 - 在
get方法中把被依赖的组件作为参数传入,Spring在调用这个方法时,会自动为你注入。
/**
* 普通类
*/
public class BaseBean {
public void p() {
System.out.println("Hello bean");
}
}
/**
* 普通类
*/
public class UserBean {
private BaseBean baseBean;
public UserBean(BaseBean baseBean) {
this.baseBean = baseBean;
}
}
/**
* 配置类
*/
@Configuration
public class BeanConfig {
// 这个方法返回一个对象,Spring会把这个对象注册为bean
@Bean
public BaseBean getBaseBean() {
return new BaseBean();
}
/**
* 以下为两种注入bean的方法
*/
// 方法一:直接调用get方法
@Bean
public UseBean getUseBean() {
return new UseBean(getBaseBean());
}
// 方法二:当做参数传入,Spring将自动为你注入
@Bean
public UseBean getUseBean(BaseBean baseBean) {
return new UseBean(baseBean);
}
}
通常情况下我们都会使用方法二。
通过XML装配bean
尽管现在我们已经不再怎么使用XML装配bean,但在Spring刚刚出现的时候,XML是描述配置的主要方式,我们还是有必要了解一下的。
在使用JavaConfig的时候,我们创建了一个配置类来装配bean,而在XML配置中,我们需要创建一个XML文件,并且要以<beans>元素为根。
最为简单的Spring 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">
<!-- 在这里配置你的bean -->
</beans>
组件配置
以上文的BaseBean为例,我们在XML文件中把它声明为bean。
<bean id="baseBean" class="com.example.demo.BaseBean" />
组件注入
<bean id="useBean" class="com.example.demo.UseBean"
c:_="baseBean" />
XML的语法我就不再这里详述了,有兴趣的同学可以自行学习。
总结
本文我们简单介绍了Spring中的IoC,介绍了Spring中装配bean的三种方式:自动化配置,基于Java的显式配置以及基于XML的显式配置。这些技术都是为了描述Spring应用中的组件以及组件之间的关系。
一般来说我们都会使用自动化配置,尽量避免显式配置带来的维护成本。如果不得不使用显式配置的话,我们优先选择基于Java的配置,它比基于XML的配置更加强大、类型安全并且易于重构。
参考资料
原文首发在我的简书 https://www.jianshu.com/p/7f7e089f4909
理解Spring中的IoC和DI的更多相关文章
- 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)
用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是 ...
- 理解Spring中的IOC和AOP
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...
- Spring核心思想——IOC和DI
基本概念 IOC是什么? IOC(Inversion of Control)控制反转,IOC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式. IOC解决了什么问题? ...
- 详谈 Spring 中的 IOC 和 AOP
这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...
- Spring中的IOC
在学习spring的时候,最常听到的词应该就是IOC和AOP了,以下,我从我的角度再次理解一下Spring里的IOC和AOP. IOC简单介绍 IoC(InversionofControl):IoC就 ...
- 通过BeanPostProcessor理解Spring中Bean的生命周期
通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 Spring源码解析(十一)Spring扩展接口InstantiationAwareBeanPostProces ...
- Spring中的IoC(控制反转)具体是什么东西
IOC:inverse of Control: 控制反转. 意思是程序中的之间的关系,不用代码控制,而完全是由容器来控制.在运行阶段,容器会根据配置信息直接把他们的关系注入到组件中.同样,这也是 依赖 ...
- 深入理解spring中的各种注解
Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...
- 深入理解spring中的各种注解(转)
Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...
随机推荐
- golang-Json编码解码
目录 一. 类型映射 二. 输出控制 三. 类型编码 四. 类型解码 五. 输出重写 六. 扩展功能 七. Bson编码 在线工具:https://www.json.cn 一. 类型映射 golang ...
- k8s时区问题解决方案
前几天在使用k8s中的CronJob时发现了一个很奇怪的问题, 按照官方文档的demo跑起来是没有任何问题的, 但是当我想要设置每天一个固定时间点例如12点20执行一个job的时候,到了时间之后无论如 ...
- es6中的arrowfunction
es6新增箭头函数,主要解决了以下几点问题 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误. 不可以使用 ...
- tomcat采坑
1. tomcat采坑 1.1. 采坑 今天又踩了个以前踩过的坑,运维系统迁移到docker,使用的tomcat版本是tomcat8,而原来的版本是tomcat7.0.53,导致的结果就是系统间请求一 ...
- 25. Apache Shiro Java反序列化漏洞
前言: 最近在审核漏洞的时候,发现尽管Apache shiro这个反序列化漏洞爆出来好久了,但是由于漏洞特征不明显,并且shiro这个组件之前很少听说,导致大厂很多服务还存在shiro反序列化的漏洞, ...
- windows下查看webp格式图片
关于webp 时下webp格式日渐势起,主流浏览器(IE: ???)已经开始支持webp,诸多互联网企业(Facebook 和 ebay,国内的有淘宝.腾讯和美团等)都已经在不遗余力的将webp应用到 ...
- Go 语言基础语法-Go
Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.如以下 GO 语句由 6 个标记组成: fmt.Println("Hello, World!") ...
- Jenkins+GitLab+Docker+SpringCloud实现可持续自动化微服务
本文很长很长,但是句句干货,点赞关注收藏后有惊喜在文末等你 现有混合云平台的场景下,即有线下和线上的环境,又有测试与正式的场景,而且结合了Docker,导致打包内容有所区分,且服务的发布流程复杂起来, ...
- iperf3 网络测试工具
Iperf3 是一个网络性能测试工具.Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失.对于每个测试,它都会报告带宽,丢包和 ...
- Golang循环中调用go func参数异常分析
项目中,需要循环调用API服务器列表,在循环中使用go func创建协程时遇到了参数失灵的现象. 具体代码如下所示: for _, apiServerAddr := range apiServerAd ...