Spring IoC 容器的简单理解(基于 XML)

发布于 2025-01-11 13:18:54 字数 4306 浏览 3 评论 0

IoC(Inversion of Control Container)容器是一种模式,并非 Spring 独有。此外,我们经常谈到的依赖注入(DI,Dependency Injection)其实也就是 IoC 容器。

IoC 容器其实很简单,只是可能从文字上理解起来有些许困难,相对的,如果是通过代码来理解 IoC 容器可能是比较好的一种方式。因此下面我们假设这么一个用户登录场景,需要校验用户名长度和密码是否为空。

未使用 IoC 容器

校验配置类 UserValidateConfig.java

package net.wuxianjie.demo.spring;

public class UserValidateConfig {

  private int userNameMinLength;

  private boolean passwordRequired;

  public UserValidateConfig() {
  }

  public int getUserNameMinLength() {
    return userNameMinLength;
  }

  public void setUserNameMinLength(int userNameMinLength) {
    this.userNameMinLength = userNameMinLength;
  }

  public boolean isPasswordRequired() {
    return passwordRequired;
  }

  public void setPasswordRequired(boolean passwordRequired) {
    this.passwordRequired = passwordRequired;
  }
}

登录业务操作类 UserService.java

package net.wuxianjie.demo.spring;

public class UserService {

  private UserValidateConfig userValidateConfig;

  public void userLogin(String userName, String email) throws Exception {
    if (userName.trim().length() < userValidateConfig.getUserNameMinLength()) {
      throw new Exception(String.format("用户名长度小于%d 位", userValidateConfig.getUserNameMinLength()));
    }
    if (userValidateConfig.isPasswordRequired() && email.trim().length() <= 0) {
      throw new Exception("密码为空");
    }

    System.out.println("开始执行用户登录");
  }

  public UserValidateConfig getUserValidateConfig() {
    return userValidateConfig;
  }

  public void setUserValidateConfig(UserValidateConfig userValidateConfig) {
    this.userValidateConfig = userValidateConfig;
  }
}

程序主类 MySpring.java

package net.wuxianjie.demo.spring;

public class MySpring {

  public static void main(String[] args) throws Exception {

    // 硬编码形式(`new` 对象,手动设置对象依赖)
    UserService userService = new UserService();

    UserValidateConfig userValidateConfig = new UserValidateConfig();
    userValidateConfig.setUserNameMinLength(2);
    userValidateConfig.setPasswordRequired(true);

    userService.setUserValidateConfig(userValidateConfig);

    userService.userLogin("Jason", "123");

  }
}

使用 IoC 容器

为了使用 Spring 的 IoC 容器,首先需要加入 Spring Framework 依赖,即在 pom.xml 中加入:

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

以 Spring 中最常见也是最经典的 XML 配置方式为例,在 resources 目录中创建 user.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 http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean class="net.wuxianjie.demo.spring.UserValidateConfig">
    <property name="userNameMinLength" value="2"/>
    <property name="passwordRequired" value="true"/>
  </bean>

  <bean class="net.wuxianjie.demo.spring.UserValidateConfig">
    <property name="userNameMinLength" value="3"/>
    <property name="passwordRequired" value="true"/>
  </bean>

  <bean class="net.wuxianjie.demo.spring.UserService">
    <property name="userValidateConfig" ref="userConfig_1"/>
  </bean>

</beans>

之后,我们的程序主类 MySpring.java 就可以使用 IoC 容器了:

package net.wuxianjie.demo.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MySpring {

  public static void main(String[] args) throws Exception {

    // IoC 容器
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("user.xml");

    UserService userService = applicationContext.getBean("userService", UserService.class);
    userService.userLogin("Jason", "123");
  }
}

从以上代码中,我们就可以很好理解为什么 IoC 容器叫做控制反转。因为在未使用 IoC 之间,我们需要先实例化配置类,然后再将配置类传入到业务类中,最后再执行业务类的具体业务方法。而在使用 IoC 之后,我们直接使用业务类的具体业务方法即可,IoC 会自动帮我们初始化并注入配置类,这个过程就被反了过来。

IoC 容器帮我们管理对象的生命周期和依赖关系,从而可使得我们将业务代码和配置信息相分离,且在配置信息发生变化时,我们无需再对源代码进行修改。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

久夏青

暂无简介

文章
评论
26 人气
更多

推荐作者

mb_TnrMmzAf

文章 0 评论 0

_1999

文章 0 评论 0

grace999

文章 0 评论 0

混浊又暗下来

文章 0 评论 0

像极了他

文章 0 评论 0

情何以堪。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文