Spring中IoC的底层原理

Spring Framework系统架构

IoC(Inversion of Control)控制反转

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

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

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

DI(Dependency Injection)依赖注入

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

业务层实现

java 复制代码
public class BookServiceImpl implements BookService {
    private BookDao bookDao;

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

依赖 dao 对象运行

数据层实现

java 复制代码
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坐标

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

XML版IOC

在xml中单独定义bean

xml 复制代码
<?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

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

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

java 复制代码
public class BookServiceImpl implements BookService {
    private BookDao bookDao;

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

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

bean的基础配置

bean的别名配置

作用范围配置

实例化 bean 的三种方式

构造方法(常用)

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

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

配置示例

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

静态工厂(了解)

静态工厂类

java 复制代码
public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        return new OrderDaoImpl();
    }
}

配置示例

xml 复制代码
<bean
    id="orderDao"
    factory-method="getOrderDao"
    class="com.itheima.factory.OrderDaoFactory"
/>

实例工厂(了解)

实例工厂类

java 复制代码
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

配置说明

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

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

第二种方法

FactoryBean 实现类

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

配置示例

xml 复制代码
<bean
    id="userDao"
    class="com.itheima.factory.UserDaoFactoryBean"
/>
相关推荐
野生的码农8 小时前
码农的妇产科实习记录
android·java·人工智能
盖世英雄酱581369 小时前
Java 组长年终总结:靠 AI 提效 50%,25 年搞副业只赚 4k?
后端·程序员·trae
毕设源码-赖学姐9 小时前
【开题答辩全过程】以 高校人才培养方案管理系统的设计与实现为例,包含答辩的问题和答案
java
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue在线音乐播放系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
一起努力啊~10 小时前
算法刷题-二分查找
java·数据结构·算法
小途软件10 小时前
高校宿舍访客预约管理平台开发
java·人工智能·pytorch·python·深度学习·语言模型
J_liaty10 小时前
Java版本演进:从JDK 8到JDK 21的特性革命与对比分析
java·开发语言·jdk
code bean10 小时前
Flask图片服务在不同网络接口下的路径解析问题及解决方案
后端·python·flask
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue律师咨询系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
努力的小郑10 小时前
2025年度总结:当我在 Cursor 里敲下 Tab 的那一刻,我知道时代变了
前端·后端·ai编程