掘金 人工智能 09月15日
Spring IoC容器:核心概念与使用详解
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入浅出地介绍了Spring框架的核心——IoC(控制反转)容器。文章首先解释了Bean的概念,即IoC容器管理的应用程序对象。随后详细阐述了IoC(或依赖注入DI)的机制,即容器负责Bean的实例化、装配和管理,对象只需声明其依赖。文章还介绍了IoC容器的关键接口BeanFactory和ApplicationContext,以及配置元数据的三种引入方式:XML、Java注解和Java代码,并强调了IoC容器与配置元数据方式的解耦。最后,文章探讨了IoC容器的实例化方式,以及如何通过ApplicationContext获取Bean,并建议在实际开发中避免直接使用getBean,推荐使用@Autowired进行依赖注入。

📦 **Bean与IoC容器的关系**:Bean是Spring IoC容器所管理的对象,通常是应用程序中的POJO类。IoC容器的核心职责就是对这些Bean进行实例化、装配和管理,确保它们能够被正确地创建和使用。

🔄 **控制反转(IoC)与依赖注入(DI)**:IoC是一种设计原则,意味着对象不直接控制其依赖项的创建和查找。依赖注入(DI)是实现IoC的一种方式,通过外部容器(IoC容器)在创建Bean时,将所需的依赖项“注入”到Bean中,对象只需通过构造器参数、工厂方法参数或属性设置来声明其依赖。

🗄️ **IoC容器的关键接口与配置元数据**:Spring IoC容器主要通过`BeanFactory`(提供基本配置和功能)和`ApplicationContext`(`BeanFactory`的子接口,增加企业级应用功能)来实现。开发者通过配置元数据(XML、Java注解或Java代码)告知容器Bean及其依赖关系,容器据此进行管理。IoC容器与配置元数据引入方式是解耦的。

🛠️ **IoC容器的实例化与使用**:现代开发中通常无需显式实例化IoC容器,框架会自动完成。`ApplicationContext`接口提供了多种实现,可以从不同资源加载配置元数据。虽然可以通过`getBean()`方法获取Bean,但为避免与Spring API过度耦合,建议在Web应用等场景下使用`@Autowired`注解进行依赖注入。

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

Spring 框架最核心的就是IoC(Inversion of Control,控制反转)容器。站在上帝视角,一图看清 IoC 容器在开发中的地位:

此刻对该图可能还有疑惑,来开启本文的征程吧。

0 Bean是什么?

被 IoC 容器管理的这些源于你的应用中的对象即是 bean,通常是个 POJO 类。

1 IoC是什么?

IoC 也被称为依赖注入(DI,Dependency Injection)。它其实是一个流程,IoC 容器负责对 bean 进行实例化、装配和管理。

在此流程中的对象仅需通过如下方式之一:

来定义其依赖(即该对象协作所需的其它对象)。然后,容器在创建 bean 时注入这些依赖项。从本质上讲,该流程也是bean自身通过使用诸如类的直接构造或类似服务定位器模式的机制来控制其依赖项的实例化或位置的的逆过程,因此得名控制反转。

2 IoC的关键接口设计

在 Spring 源码中,IoC 容器实现主要基于如下两个包:

常见接口:

2.1 BeanFactory

提供了配置框架和基本功能。别看它其貌不扬,实则是种高级的配置机制,能够管理任意类型的对象。

2.2 ApplicationContext

BeanFactory的子接口,基于父接口添加一些方便企业应用开发功能:

该接口可算得上是BeanFactory的一个较为完整的超集,因此我们常说的Spring容器也就是它。

现在,让我们再看看首图中的配置元数据的作用。

3 配置元数据(configuration metadata)

开发者能够通过配置元数据告知 Spring 容器应用中的对象及对象间依赖关系。籍此,容器读取 配置元数据后 ,便知晓哪些对象需要被实例化、配置和装配。

那么配置元数据从何而来?Spring 提供了如下三种引入方式:

    XML:远古的最初用法,由于繁琐,现代开发中基本不再使用。但这的确也是一种简单和直观的对象细节说明,所以本专栏有时也将沿用该方式描述 bean 信息Java注解:Spring 2.5开始提供Java代码:Spring 3.0开始提供

IoC容器本身是和元数据配置引入方式是 完全 解耦的,三种可混用,只是开发规范上建议统一。

配置中至少得包含一个(开发中一般都是多个)容器必须管理的bean定义。如用Java代码方式:通常在一个被@Configuration的类中,在方法上用@Bean

@Configurationpublic class RabbitMsgConvertConfigure {    // 队列名称    public final static String SPRING_BOOT_QUEUE = "spring-b";        // 交换机名称    public final static String SPRING_BOOT_EXCHANGE = "sprin";        // 绑定的值    public static final String SPRING_BOOT_BIND_KEY = "sprin";    // 在RabbitMQ上创建queue,exchange,binding: 通过@Bean实现    // 定义队列    @Bean    Queue queue() {        return new Queue(SPRING_BOOT_QUEUE, durable: false);    }}

4 如何实例化容器?

现代开发中基本也无需显式实例化IoC容器。即使在web.xml文件也只需简单几行样板式配置。

<context-param>    <param-name>contextConfigLocation</param-name>    <param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value></context-param><listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

easy cash!由于ApplicationContext接口有多种实现,因此容器可从多种外部资源获取。比如,在我们初学 Spring 时的单体应用中一定都创建过如下实例,直接将位置路径传给容器的构造器即可让容器加载配置元数据:

ClassPathXmlApplicationContext:

ApplicationContext context = new ClassPathXmlApplicationContext(    "classpath:/org/springframework/web/context/WEB-INF/applicationContext.xml");

FileSystemXmlApplicationContext:

ConfigurableApplicationContext ctx =     new FileSystemXmlApplicationContext(new String[] {"file:" + tmpFile.getPath()}, refresh: false);

5 咋用容器?

通过ApplicationContext的实例,即可用来读取bean定义并访问其方法。

ApplicationContext 作为一种高级容器的工厂接口,关键在于可维护不同bean和它们之间的依赖关系。在初学 Spring 时我们经常直接调用其 getBean 方法的各种不同重载形式,来方便地获取所需实例。

// 1. 创建并配置beansClassPathXmlApplicationContext ctx =     new ClassPathXmlApplicationContext(path: getClass().getSimpleName() + ".xml", getClass());// 2. 取得配置的实例testBeanProxy = (ITestBean) ctx.getBean(name: "testBean");// 3. 使用实例this.testBeanTarget = (TestBean) Objects.requireNonNull(((Advised) testBeanProxy).getTargetSource().getTarget());

为避免与Spring API过度耦合,实际代码不应直接调用getBean()。 因此Spring与Web框架的集成为Web组件比如控制器,也提供依赖注入方式,使得可通过@Autowired配置元数据声明对特定bean的依赖。

本文由博客一文多发平台 OpenWrite 发布!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Spring IoC 控制反转 依赖注入 BeanFactory ApplicationContext Bean Spring Framework
相关文章