【Java教程】Day22-04 Spring框架:IoC容器—— 如何使用IoC容器管理Bean

1. IoC容器的基本概念

1.1 Spring提供的容器与IoC

在之前的章节中,我们讨论了使用Spring的IoC容器的优势,因为让容器负责创建并装配Bean可以带来许多好处。那么,如何使用Spring的IoC容器呢?装配好的Bean又如何在应用中使用?本章将通过一个具体的用户注册登录的例子来展示IoC容器的使用。

2. 构建一个简单的用户注册登录示例

假设我们有一个用户注册和登录的功能,工程的结构如下:


 
cssspring-ioc-appcontext├── pom.xml└── src    └── main        ├── java        │   └── com        │       └── itranswarp        │           └── learnjava        │               ├── Main.java        │               └── service        │                   ├── MailService.java        │                   ├── User.java        │                   └── UserService.java        └── resources            └── application.xml

 

2.1 引入Spring框架

首先,使用Maven创建项目并引入Spring的spring-context依赖:


 
xml<dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context</artifactId>    <version>6.0.0</version></dependency>

 

2.2 编写MailService类

MailService类用于在用户注册和登录成功后发送邮件通知:


 

 

javapublic class MailService {    private ZoneId zoneId = ZoneId.systemDefault();    public void setZoneId(ZoneId zoneId) {        this.zoneId = zoneId;    }    public String getTime() {        return ZonedDateTime.now(this.zoneId).format(DateTimeFormatter.ISO_ZONED_DATE_TIME);    }    public void sendLoginMail(User user) {        System.err.println(String.format("Hi, %s! You are logged in at %s", user.getName(), getTime()));    }    public void sendRegistrationMail(User user) {        System.err.println(String.format("Welcome, %s!", user.getName()));    }}

 

2.3 编写UserService类

UserService类实现用户的注册和登录功能,使用MailService发送邮件通知:


 
javapublic class UserService {    private MailService mailService;    public void setMailService(MailService mailService) {        this.mailService = mailService;    }    private List<User> users = new ArrayList<>(List.of(        new User(1, "bob@example.com", "password", "Bob"),        new User(2, "alice@example.com", "password", "Alice"),        new User(3, "tom@example.com", "password", "Tom")    ));    public User login(String email, String password) {        for (User user : users) {            if (user.getEmail().equalsIgnoreCase(email) && user.getPassword().equals(password)) {                mailService.sendLoginMail(user);                return user;            }        }        throw new RuntimeException("login failed.");    }    public User register(String email, String password, String name) {        users.forEach((user) -> {            if (user.getEmail().equalsIgnoreCase(email)) {                throw new RuntimeException("email exist.");            }        });        User user = new User(users.stream().mapToLong(u -> u.getId()).max().getAsLong() + 1, email, password, name);        users.add(user);        mailService.sendRegistrationMail(user);        return user;    }}

 

2.4 配置Spring的IoC容器

接下来,我们编写Spring的application.xml配置文件,告诉Spring IoC容器如何创建和组装这些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="userService" class="com.itranswarp.learnjava.service.UserService">        <property name="mailService" ref="mailService" />    </bean>    <bean id="mailService" class="com.itranswarp.learnjava.service.MailService" /></beans>

 

2.5 Java代码方式的配置

如果我们用Java代码来配置这些Bean,会像下面这样:


 
javaUserService userService = new UserService();MailService mailService = new MailService();userService.setMailService(mailService);

 

Spring容器通过反射机制来完成这些操作,而不是我们手动去创建实例和注入依赖。

2.6 注入基本类型的属性

除了注入Bean对象,Spring还允许注入基本类型数据(如intbooleanString等)。例如,我们可以使用value来注入数据库连接的配置:


 
xml<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />    <property name="username" value="root" />    <property name="password" value="password" />    <property name="maximumPoolSize" value="10" />    <property name="autoCommit" value="true" /></bean>

 

3. 启动IoC容器并获取Bean

3.1 启动Spring容器

接下来,我们需要启动Spring的IoC容器,并从容器中获取已经装配好的Bean。我们通过ClassPathXmlApplicationContext来加载application.xml配置文件并创建容器:


 
javaApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

 

3.2 使用Bean

从容器中获取UserService的实例并进行操作:


 
javaUserService userService = context.getBean(UserService.class);User user = userService.login("bob@example.com", "password");System.out.println(user.getName());

 

4. ApplicationContext与BeanFactory的区别

4.1 ApplicationContext

ApplicationContext是Spring的核心接口之一,表示整个IoC容器,它有多个实现类,其中ClassPathXmlApplicationContext用于从classpath加载XML配置文件并创建容器。ApplicationContext会在启动时加载并初始化所有的Bean。

4.2 BeanFactory

BeanFactory是Spring容器的另一个接口,功能和ApplicationContext类似,但它在创建Bean时是按需创建的,即第一次调用getBean()时才会实例化Bean。与ApplicationContext相比,BeanFactory不提供一些附加功能,如国际化支持、事件处理等。因此,ApplicationContext通常是我们优先选择的IoC容器。


 
javaBeanFactory factory = new XmlBeanFactory(new ClassPathResource("application.xml"));MailService mailService = factory.getBean(MailService.class);

 

5. 小结

  1. IoC容器接口:Spring的IoC容器接口是ApplicationContext,提供了多种实现类来满足不同需求。

  2. 加载配置文件:使用ClassPathXmlApplicationContext来加载配置文件并创建IoC容器。

  3. 获取Bean:通过context.getBean()获取装配好的Bean。

  4. Bean的注入:Spring通过XML配置文件或Java代码注入Bean的依赖,支持构造器注入和Setter方法注入。

练习

在上述示例的基础上,尝试继续给UserService注入DataSource,并通过数据库实现用户的注册和登录功能。

 


 

通过这个简单的例子,我们学习了如何使用Spring IoC容器来管理对象的生命周期和依赖关系。在实际开发中,IoC容器不仅可以简化代码,还可以增强代码的可维护性和可测试性。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值