Spring IoC 容器的简单理解(基于 XML)
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 技术交流群。
下一篇: 不要相信一个熬夜的人说的每一句话
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论