java八股文IOC

IOC

简介:IOC称为控制反转,将依赖对象注入当前对象,当前对象没有对依赖对象的控制,实现代码之间的解耦,控制反转不是一种技术,而是一种设计思想。

传统开发:你(程序员)手动创建对象、管理对象之间的依赖关系(比如在 A 类里 new B() 来调用 B 的方法),控制权在你手里。

IOC 思想:把创建对象、管理依赖的控制权 "反转" 出去,交给一个统一的 "容器"(比如 Spring IOC 容器)来管理。你只需要告诉容器 "需要什么",容器会主动把对象(Bean)给你,无需手动 new。

IOC的实现

1.构造器注入

java 复制代码
//创建一个水杯类
class Cup{
    public void holdCup(){
        System.out.println("水杯装水");
    }
}
//人喝水,构造器注入
class Person{
    private Cup cup;
    //构造器注入依赖
    public Person(Cup cup){
        this.cup=cup;
    }
    public void drinkWater(){
        cup.holdCup();
        System.out.println("人喝水");
    }
}
//IOC容器,将创建Peeson对象需要的依赖注入
class IocContainer{
    public static Cup getCup(){
        return new Cup() ;
    }
    public static Person getPerson(){
        return new Person(getCup());
    }
}
public class IOC {
    public static void main(String[] args) {
        // 直接从容器拿对象,无需关心创建和依赖
        Person person=IocContainer.getPerson();
        person.drinkWater();

        //没有Ioc容器原本需要创建对象和依赖注入
        Cup cup=new Cup();
        Person person1=new Person(cup);
        person1.drinkWater();
    }
}

2.Setter 方法注入

java 复制代码
class Person {
    private Cup cup;
    
    // Setter方法注入
    public void setCup(Cup cup) {
        this.cup = cup;
    }
    
    public void drinkWater() {
        cup.holdWater();
        System.out.println("喝水");
    }
}

// 容器中注入方式
class IocContainer {
    public static Person getPerson() {
        Person person = new Person();
        person.setCup(getCup()); // Setter注入
        return person;
    }
    
    public static Cup getCup() {
        return new Cup();
    }
}

3.注解注入(spring中常用)

Spring 框架中通过@Component(标记 Bean)、@Autowired(自动注入)实现IOC:

java 复制代码
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;

@Component
//创建一个水杯类
class Cup{
    public void holdCup(){
        System.out.println("水杯装水");
    }
}
@Component
//人喝水,构造器注入
class Person{
    @Autowired
    private Cup cup;
    //构造器注入依赖
    public void drinkWater(){
        cup.holdCup();
        System.out.println("人喝水");
    }
}
//IOC容器,将创建Peeson对象需要的依赖注入

public class IOC {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext("com.example.demo");
        Person person= context.getBean(Person.class);
        person.drinkWater();
    }
}

总结

IOC 的核心优势:

1.降低耦合:类不再依赖具体的实现类,而是依赖容器注入的对象,修改实现类无需改动业务代码。

2.便于测试:可以轻松注入模拟对象(Mock),方便单元测试。

3.提高复用性:对象由容器统一管理,可重复使用。

4.简化配置:Spring 容器统一管理对象的生命周期和依赖,无需手动维护。

IOC 核心:将对象的创建、依赖管理从代码转移到外部容器,实现 "控制反转"。

实现方式:依赖注入(DI),包括构造器注入、Setter 注入、注解注入(Spring 主流)。

核心价值:降低代码耦合度,提高代码可维护性和可测试性,是 Spring 框架的基础。

相关推荐
ACGkaka_4 小时前
SimpleDateFormat 线程安全问题及修复方案
java·jvm·安全
leo_messi944 小时前
多线程(五) -- 并发工具(二) -- J.U.C并发包(八) -- CompletableFuture组合式异步编程
android·java·c语言
m0_380113845 小时前
SpringBoot创建动态定时任务的几种方式
java·spring boot·spring
Gofarlic_OMS5 小时前
SolidEdge专业许可证管理工具选型关键评估标准
java·大数据·运维·服务器·人工智能
清华都得不到的好学生5 小时前
数据结构->1.稀疏数组,2.数组队列(没有取模),3.环形队列
java·开发语言·数据结构
weyyhdke5 小时前
基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践
java·spring boot·spring
ILYT NCTR5 小时前
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
java·spring boot·spring
weixin_425023005 小时前
PG JSONB 对应 Java 字段 + MyBatis-Plus 完整实战
java·开发语言·mybatis
不早睡不改名@6 小时前
Netty源码分析---Reactor线程模型深度解析(二)
java·网络·笔记·学习·netty
子非鱼@Itfuture6 小时前
`<T> T execute(...)` 泛型方法 VS `TaskExecutor<T>` 泛型接口对比分析
java·开发语言