什么是Spring IOC?有什么作用?

IOC(控制反转)是将对象的创建和管理权交给容器,如Spring的IOC容器,通过依赖查找或依赖注入管理对象。DI是IOC的一种实现,通过构造器、字段或setter方法注入依赖。IOC的优点包括集中管理对象、降低耦合度和方便维护。Spring实现IOC基于工厂模式和反射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是IOC?

IOC的全英文名是:Inversion Of Control ,直译过来就是控制反转,控制反转是把传统上由程序代码直接操控对象(new对象)的调用权交给ioc容器,由容器来实现对象的创建,依赖,销毁,初始化等等。

2、什么是 Spring IOC 容器?

Spring 框架是一个 IOC 容器的实现,DI 依赖注入是它的实现的一个原则,提供依赖查找和依赖注入两种依赖处理,管理着 Bean 的生命周期。Spring 还提供了 AOP 抽象、事件抽象、事件监听机制、SPI 机制、强大的第三方整合、易测试性等其他特性。

3、IOC 容器的作用?

  • 依赖处理,通过依赖查找或者依赖注入
  • 管理托管的资源(Java Bean 或其他资源)的生命周期
  • 管理配置(容器配置、外部化配置、托管的资源的配置)

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI)装配对象、配置对象)并且管理这些对象的整个生命周期。

简单的来说就是:

我们自己new一个对象,可能会导致程序耦合度过高,后期可能维护不便。引入IOC,将创建对象的控制权交给Spring的IOC容器;如果要去使用对象,通过DI(依赖注入)@Autowired注解 自动注入,就可以使用对象了!

4、IOC 和 DI 的区别?

DI 依赖注入不完全等同于IOC ,更应该说 DI 依赖注入是 IOC 的一种实现方式或策略。

依赖查找和依赖注入都是 IOC 的实现策略。

  • 依赖查找就是在应用程序里面主动调用 IOC 容器提供的接口去获取对应的 Bean 对象,而依赖注入是在 IOC 容器启动或者初始化的时候,通过构造器、字段、setter 方法或者接口等方式注入依赖。
  • 依赖查找相比于依赖注入对于开发者而言更加繁琐,具有一定的代码入侵性,需要借助 IOC 容器提供的接口,所以我们总是强调后者。
  • 依赖注入在 IOC 容器中的实现也是调用相关的接口获取 Bean 对象,只不过这些工作都是在 IOC 容器启动时由容器帮你实现了,在应用程序中我们通常很少主动去调用接口获取 Bean 对象。

5、IOC的优点有哪些?

  • 集中管理对象、方便维护 、降低耦合度

  • 最小的代价和最小的侵入性使松散耦合得以实现

  • IOC容器支持加载服务时的饿汉式,初始化的懒加载

6、Spring IoC 的实现机制是什么?

Spring 中的 IoC 的实现原理就是工厂模式加反射机制。

工厂相对应的就是beanfactory的getBean()方法,反射就是Spring底层实例化对象所采用的机制

实现代码示例:

interface fruit{
    void eat();
}
 
class Apple implements fruit {
    @Override
    public void eat() {
        System.out.println("Apple");
    }
}
 
class Orange implements fruit {
    @Override
    public void eat() {
        System.out.println("Orange");
    }
}
 
class Factory {
    public static fruit getInstance(String ClassName) {
        fruit f = null;
        //通过反射创建对象 
        try {
            // 相当于Spring中new了一个ClassPathXmlApplicationContext
            f = (fruit)Class.forName(ClassName).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}
 
class Test {
    public static void main(String[] args) {
        //getInstance时静态的,直接调用即可Factory.getInstance()
        fruit f = Factory.getInstance("Apple");
        if(f != null)
            f.eat();
    }
}
 
//输出 Apple

注意点:

  • Class.forName(“”)返回的是类
  • Class.forName(“”).newInstance()返回的是object

源码下载:https://gitee.com/charlinchenlin/koo-erp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值