Spring中IoC的底层原理

Spring Framework系统架构

在这里插入图片描述

IoC(Inversion of Control)控制反转

  • 使用对象时,由主动 new 产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转

Spring 技术对 IoC 思想进行了实现

  • Spring 提供了一个容器,称为 IoC 容器,用来充当 IoC 思想中的 “外部”
  • IoC 容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在 IoC 容器中统称为 Bean

DI(Dependency Injection)依赖注入

  • 在容器中建立 bean 与 bean 之间的依赖关系的整个过程,称为依赖注入

业务层实现

public class BookServiceImpl implements BookService {
    private BookDao bookDao;

    public void save() {
        bookDao.save();
    }
}

依赖 dao 对象运行

数据层实现

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}

在IoC容器中,service依赖dao

目标:充分解耦

  • 使用 IoC 容器管理 bean(IoC)
  • 在 IoC 容器内将有依赖关系的 bean 进行关系绑定(DI)

最终效果

  • 使用对象时不仅可以直接从 IoC 容器中获取,并且获取到的 bean 已经绑定了所有的依赖关系

maven坐标

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

XML版IOC

在xml中单独定义bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean>
</beans>

注意事项

  • bean 定义时 id 属性在同一个上下文中不能重复

初始化 IoC 容器(Spring 核心容器 / Spring 容器),通过容器获取 bean

public class App {
    public static void main(String[] args) {
        //加载配置文件得到上下文对象,也就是容器对象
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取资源
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

提供依赖对象对应的 setter 方法

public class BookServiceImpl implements BookService {
    private BookDao bookDao;

    public void save() {
        bookDao.save();
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

在这里插入图片描述

bean的基础配置

在这里插入图片描述

bean的别名配置

在这里插入图片描述

作用范围配置

在这里插入图片描述

实例化 bean 的三种方式

构造方法(常用)

要求:提供可访问的构造方法

public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("book constructor is running ...");
    }
    public void save() {
        System.out.println("book dao save ...");
    }
}

配置示例

<bean
    id="bookDao"
    class="com.itheima.dao.impl.BookDaoImpl"
/>
  • 注意:无参构造方法如果不存在,将抛出异常BeanCreationException

静态工厂(了解)

静态工厂类

public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        return new OrderDaoImpl();
    }
}

配置示例

<bean
    id="orderDao"
    factory-method="getOrderDao"
    class="com.itheima.factory.OrderDaoFactory"
/>

实例工厂(了解)

实例工厂类

public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

配置说明

<!-- 配置实例工厂的bean -->
<bean id="userDaoFactory" class="com.itheima.factory.UserDaoFactory"/>

<!-- 通过实例工厂创建目标bean -->
<bean
    id="userDao"
    factory-method="getUserDao" <!-- 工厂方法名(不固定,每次需配置) -->
    factory-bean="userDaoFactory" <!-- 关联实例工厂的bean(配合使用) -->
/>

第二种方法

FactoryBean 实现类

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }
    public Class<?> getObjectType() {
        return UserDao.class;
    }
}

配置示例

<bean
    id="userDao"
    class="com.itheima.factory.UserDaoFactoryBean"
/>
<think>好的,我现在需要帮用户解答关于Spring框架中IoC底层原理的问题,用于Java面试准备。首先,我得回顾一下用户提供的引用内容,看看有哪些信息可以利用。 根据引用[1],Spring的核心功能包括IoC容器和依赖注入,而引用[4]提到了IoC容器的两种实现方式:BeanFactory和ApplicationContext。用户可能想知道这两者的区别,以及IoC是如何在底层运作的。 引用[3]提到了Bean的生命周期,包括初始化和销毁方法,还有BeanPostProcessor的使用。这部分内容在解释IoC容器管理Bean的过程时非常重要,需要详细说明Bean的实例化、依赖注入、初始化等步骤。 用户的问题集中在底层原理,所以需要深入探讨IoC容器的实现机制,比如如何通过配置文件或注解定义Bean,容器如何解析这些配置,以及如何创建和管理Bean实例。此外,依赖注入的方式(构造器注入、setter注入)也是重点。 可能还需要提到BeanFactory和ApplicationContext的区别,如ApplicationContext在启动时预初始化Bean,而BeanFactory是延迟初始化。同时,Bean的生命周期中的后置处理器(BeanPostProcessor)对扩展容器功能的作用也很关键。 另外,结合引用[2]和[3],可以说明容器在初始化过程中还会处理国际化、事件广播等内建Bean,这些也是IoC容器的一部分,但用户可能更关注核心的Bean管理流程。 要确保回答结构清晰,分步骤解释IoC的工作流程,并结合底层实现细节,比如反射、工厂模式等。最后,生成的相关问题需要覆盖Bean生命周期、依赖注入方式、BeanFactory与ApplicationContext的区别以及循环依赖的处理,这些都是常见的面试题。</think>### Spring框架IoC底层实现原理分步解析 #### 一、核心实现架构 Spring IoC容器通过$BeanFactory$接口和$ApplicationContext$接口实现[^4],底层采用工厂模式+反射机制构建对象管理体系。 #### 二、核心实现流程 1. **配置元数据加载** - 解析XML/注解/JavaConfig配置 - 生成$BeanDefinition$对象存储类定义信息 ```java // 伪代码示例:Bean定义存储结构 class BeanDefinition { String className; String scope; ConstructorArgumentValues constructorArgs; PropertyValues propertyValues; } ``` 2. **实例化对象** - 通过反射调用构造函数创建原始对象 - 使用$InstantiationStrategy$策略处理实例化过程 $$ Object instance = Class.forName(className).newInstance(); $$ 3. **依赖注入** - 按类型($byType$)或名称($byName$)匹配依赖 - 递归完成属性注入(setter/构造器) ```java // 伪代码:属性注入过程 for (PropertyValue pv : beanDefinition.getPropertyValues()) { Field field = bean.getClass().getDeclaredField(pv.getName()); field.setAccessible(true); field.set(bean, resolveDependency(pv.getValue())); } ``` 4. **生命周期管理** - 调用$BeanPostProcessor$实现扩展功能[^3] - 执行初始化方法(@PostConstruct、InitializingBean) - 注册销毁方法(@PreDestroy、DisposableBean) #### 三、关键设计模式 1. **工厂模式**:$BeanFactory$统一管理对象创建 2. **策略模式**:依赖注入策略可配置(构造器/setter) 3. **模板方法**:定义Bean创建的标准流程 4. **观察者模式**:处理Bean生命周期事件 #### 四、高级特性实现 1. **循环依赖解决** - 三级缓存机制: - singletonFactories(三级) - earlySingletonObjects(二级) - singletonObjects(一级) 2. **作用域扩展** - 通过$Scope$接口实现prototype/request/session等作用域 - 使用装饰器模式管理不同作用域对象 3. **AOP集成** - 在Bean初始化阶段通过$BeanPostProcessor$织入代理 - 使用CGLIB/JDK动态代理实现切面增强
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值