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 框架的基础。

相关推荐
程序员小八7778 小时前
Java 快速转 Go
java·python·golang
职场的momo8 小时前
11个后端与AI岗位同时开放:Java、网关、推理优化怎么匹配
java·开发语言·人工智能
罗超驿8 小时前
SpringMVC 请求参数接收详解|单个参数、多参数、对象参数、@RequestParam参数重命名
java·后端·postman·javaee
古法安卓9 小时前
Android-epoll原理详解
android·java·android studio
fireworks999 小时前
接口鉴权(401与403)
java·后端
wear工程师10 小时前
线程池里的异常去哪了?execute 和 submit 不是一回事
java
孔明click3310 小时前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·sa-token·springboot·权限·权限认证
吴声子夜歌10 小时前
Java面试——设计模式(一)
java·设计模式·面试
半亩码田10 小时前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
老郑聊AI业财智造10 小时前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程