SpringIOC

SpringIOC

官方文档

什么是 Spring IOC?

Spring IOC(Inversion of Control)是 Spring 框架的核心功能之一,它是一种设计模式,也称为依赖注入(Dependency Injection,DI)。它可以帮助开发者通过将对象的创建和依赖关系管理从代码中分离出来,实现松耦合,易于维护和测试的应用程序。

Spring IOC 的使用步骤

1. 添加依赖

首先,在项目中添加 Spring 的依赖。这里以 Maven 项目为例,在 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

其中,${spring.version} 是 Spring 的版本号。

2. 配置 Spring 容器

在 Spring 中,对象的创建和依赖关系管理由 Spring 容器负责。因此,我们需要先配置 Spring 容器。

  1. 使用 XML 配置文件

首先,创建一个名为 applicationContext.xml 的文件,放在项目的 src/main/resources 目录下。在该文件中,配置 Spring 容器,如下所示:

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置一个名为 "helloWorld" 的 Bean -->
    <bean id="helloWorld" class="com.example.HelloWorld"/>
</beans>

在上面的配置中,我们定义了一个名为 helloWorld 的 Bean,它的类是 com.example.HelloWorld。这样,当 Spring 容器启动时,它会自动创建 HelloWorld 对象,并将其存储在容器中。

  1. 使用注解

除了使用 XML 配置文件外,我们还可以使用注解来配置 Spring 容器。首先,需要在项目中添加如下依赖:

然后,在需要被 Spring 容器管理的类上,添加 @Component 注解,如下所示:

@Component
public class HelloWorld {
    
    public void sayHello() {
        System.out.println("Hello, world!");
    }
    
}

这样,当 Spring 容器启动时,它会自动扫描项目中的 @Component 注解,创建相应的对象,并将其存储在容器中。

3. 获取 Bean 对象

在配置好 Spring 容器后,我们就可以通过容器来获取相应的 Bean 对象了。

  1. 使用 XML 配置文件

在 XML 配置文件中,我们可以使用 <bean> 标签中的 id 属性或 name 属性来指定 Bean 的名称,然后通过 Spring 容器的 getBean() 方法来获取该对象。例如:

// 加载 Spring 配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取"helloWorld"对象
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
// 调用"helloWorld"对象的sayHello方法
helloWorld.sayHello();
  1. 使用注解

使用注解配置的 Bean 对象可以通过在需要使用它的类中添加 @Autowired 注解来实现自动注入,如下所示:

@Component
public class MyService {

    @Autowired
    private HelloWorld helloWorld;
    // ...
}

在上面的例子中,当 Spring 容器启动时,它会自动创建 MyService 对象,并将名为 helloWorld 的 Bean 对象注入到该对象中的 helloWorld 字段中。

4.使用 Bean 对象

一旦获取到 Bean 对象后,我们就可以使用它了。例如,如果是一个 Java 类,我们可以调用它的方法或者访问它的属性:

helloWorld.sayHello();

5. 框架分析

Spring IoC容器是Spring框架中的一个重要组件,它负责管理应用程序中的对象。我们可以通过Spring IoC容器来实现对象的创建、配置和组装,以及对象之间的依赖关系的注入。在Spring框架中,ApplicationContext接口代表了Spring IoC容器,它通过读取配置文件(如XML、Java注解或Java代码)来获取对象的创建和依赖注入的指令。通过这些指令,Spring IoC容器可以创建对象并将它们注入到其他对象中,从而实现对象之间的依赖关系。简而言之,Spring IoC容器就是一个可以管理对象的工厂,能够帮助我们更方便地管理和维护应用程序中的对象。

Spring 提供了 ApplicationContext 接口的几个实现。在应用程序中,通常会创建 ClassPathXmlApplicationContextFileSystemXmlApplicationContext 的实例。

虽然XML一直是定义配置的传统格式,但是现在Spring框架也支持使用Java注解或代码来定义对象的元数据信息。我们可以通过在配置文件中提供少量的XML配置,来指示容器使用这些新的元数据格式来配置和管理我们的对象。这种方式称为以声明方式配置,可以简化我们的配置工作,提高代码的可读性和可维护性。

XML 不是唯一的配置形式。现在流行基于 Java 的配置

Spring容器的生命周期

Spring容器的生命周期可以分为以下三个阶段:

  1. 实例化:在实例化阶段,Spring容器会根据配置文件或注解信息创建并实例化Bean对象。

  2. 初始化:在初始化阶段,Spring容器会为Bean对象设置属性和依赖关系,然后调用Bean对象的初始化方法。

  3. 销毁:在销毁阶段,Spring容器会销毁不再需要的Bean对象,并调用它们的销毁方法。

需要注意的是,Spring容器的实例化和初始化是在容器启动时自动进行的,而销毁是在容器关闭时进行的。同时,在Bean对象的生命周期中,也可以通过实现特定的接口或注解来控制Bean对象的初始化和销毁过程。例如,通过实现InitializingBean接口和DisposableBean接口,可以在Bean对象初始化和销毁时执行特定的操作;或者通过使用@PostConstruct和@PreDestroy注解,也可以实现类似的功能。

动态创建bean

// 获取ApplicationContext并强制转换为ConfigurableApplicationContext
ConfigurableApplicationContext configurableContext = (ConfigurableApplicationContext) SpringContextUtils.getApplicationContext();
// 创建要动态创建的bean
TestClas testClas = new TestClas();
// 注册到Spring容器中
configurableContext.getBeanFactory().registerSingleton("testClas", testClas);
// 刷新容器
configurableContext.refresh();

参考文档