简单理解什么是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自动装配的底层原理


目录
相关文章
|
29天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
20天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
|
3月前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
2月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
134 9
|
2月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
33 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
2月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
32 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
3月前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
42 4
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
73 0
|
2月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
48 0
|
4月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)