简单理解什么是Spring中的IOC控制反转和DI依赖注入,Spring对象的三种创建方式

简介: 简单理解什么是Spring中的IOC控制反转和DI依赖注入,Spring对象的三种创建方式

IOC :Inversion of Control 控制反转

DI : dependency Injection 依赖注入

咋一听,控制反转、依赖注入,似乎很高大上的名字,概念比较抽象,但其实慢慢分析,转换成自己的话也不难理解:


IOC的理解:

在原始社会的时候,我们需要自己生火、自己挖井。这个时候主动权在自己手里。随着时代的发展我们现在有燃气公司和水利公司。我们现在想喝水直接扭水龙头水就流出来了,但是水这个来源的控制权交给自来水公司了,这个过程称之为控制反转


对于Spring来说,以前自己创建的对象UserService service = new UserServiceImpl(),

service.xxx()

而现在,对象的创建交给Spring工厂,用的时候去工厂中获取,

ClassPathXmlApplicationContext ac = new …;


从之前自己创建对象,到现在交给Spring工厂创建对象,包括给属性赋值也交给Spring工厂来完成,这个由我们自己完成一些事情转移到Spring框架完成这些事情的过程,Spring称之为控制反转(IOC)

DI (依赖注入):

如果我们站在spring工厂的角度,工厂创建需要的对象,并且还可以给程序员中的类的属性赋值,对象由工厂创建,最终由程序员使用,这就是spring的依赖注入

IOC和DI实际上是等同的概念,如果要进行区分的话,IOC和DI可以理解为同一个东西的不同角度看法,IOC

站在程序员的角度,以前创建对象是我们自己new出来的,现在让容器自己创建,控制权交给了容器,对于

我们来说控制权反转了。

DI是站在容器的角度,从Spring角度来看,用到的所有的对象都是自己创建的,并且对象在创建的时候需要

依赖的参数也是容器注入的,而这种维持对象之间依赖关系的方式就是依赖注入。


所以IOC和DI实际上都是指容器负责创建对象和维护对象之间依赖关系的这种行为。

说到这里,再来分析一下Spring创建对象的三种方式:

1,通过构造方法创建,采用默认的构造函数,

也就是通过xml+bean标签,bean标签要写class的类的全限定名,其原理是通过java类的反射机制创建对象。

index : 参数的索引,从0 开始

name: 参数名

type:类型(区分开关键字和封装类int 和Integer)

<bean id="peo" class="com.macw.pojo.People">
<!-- ref 引用另一个bean value 基本数据类型或String 等-->
    <constructor-arg index="0" name="id" type="int"  value="123"></constructor-arg>
    <constructor-arg index="1" name="name" type="java.lang.String" value="张三"></constructor-arg>
</bean>

在早期Spring1.0版本,还没有注解的时候,Spring能够帮我们创建对象和管理对象,

但是没有注解每创建一个对象就要配置一个xml,其实还没有我们直接new一个对象来得快呢,


但是为什么spring框架仍然有他的极大优势呢,因为他最重要的一个特性是能够帮我们管理对象,

自己new对象在类中多处调用会造成程序模块之间耦合性太强,不利于维护更新。而spring帮我们管理对象通过依赖注入声明的是管理对象的关系。


2、通过实例工厂创建对象
也就是 工厂设计模式:帮助创建类对象,一个工厂可以生产多个对象

// 工厂,创建对象
public class StudentFactory {
    // 实例方法创建对象
    public Student getInstance() {
        return new User(001,"学生工厂:调用实例方法");
    }
    // 静态方法创建对象
    public static Student getStaticInstance() {
        return new Student(002," 学生工厂:调用静态方法");
    }
}
配置文件:
<!-- # 3.1 工厂类,实例方法 -->
    <!-- 先创建工厂 -->
    <bean id="factory" class="com.macw.StudentFactory"></bean>
    <!-- 在创建student对象,用factory方的实例方法 -->
    <bean id="student2" factory-bean="factory" factory-method="getInstance"></bean>

其中: factory-bean=”factory”指定工厂。factory-method=”getInstance”指定工厂的哪个方法。

3.静态工厂创建对象,不需要创建工厂,快速创建对象

实现步骤:编写一个静态工厂(在方法上添加static)

public class StudentFactory{
    public static Student newInstance(){
        return new Student(001,"studentTest");
    }
}
在applicationContext.xml中
<bean  id = "student2"  class = "com.macw.pojo.StudentFactory"  factory-method = "newInstance"></bean>

在spring2.0之后采用注解的形式开发,减少了大量 的xml配置文件,开发的形式变为xml+bean配置数据源,大量使用第三方框架,通过组件注解配置自己的类。


spring3.0之后采用配置类+bean注解来创建对象,目的想取代xml配置文件,也就是springboot自动装配的底层原理


目录
相关文章
|
16天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
14天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
1月前
|
Java 数据库 数据安全/隐私保护
轻松掌握Spring依赖注入:打造你的登录验证系统
本文以轻松活泼的风格,带领读者走进Spring框架中的依赖注入和登录验证的世界。通过详细的步骤和代码示例,我们从DAO层的创建到Service层的实现,再到Spring配置文件的编写,最后通过测试类验证功能,一步步构建了一个简单的登录验证系统。文章不仅提供了实用的技术指导,还以口语化和生动的语言,让学习变得不再枯燥。
42 2
|
3月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
45 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
3月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
57 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
4月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
4月前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
5月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
73 0
|
XML Java API
Spring 依赖注入的方式,你了解哪些?
前言 依赖查找和依赖注入是 Spring 实现 IoC 容器提供的两大特性,相对于依赖查找,Spring 更推崇的是使用依赖注入,本篇先对 Spring 中依赖注入的几种方式进行介绍,后续再分享其实现。
250 0
Spring 依赖注入的方式,你了解哪些?
|
Java 测试技术 开发者
Spring 有哪几种依赖注入方式?官方是怎么建议使用的呢?
IDEA 提示 Field injection is not recommended 在使用IDEA 进行Spring 开发的时候,当你在字段上面使用@Autowired注解的时候,你会发现IDEA 会有警告提示:
312 0
Spring 有哪几种依赖注入方式?官方是怎么建议使用的呢?
下一篇
开通oss服务