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/beanshttps://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还允许注入基本类型数据(如int、boolean、String等)。例如,我们可以使用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. 小结
-
IoC容器接口:Spring的IoC容器接口是
ApplicationContext,提供了多种实现类来满足不同需求。 -
加载配置文件:使用
ClassPathXmlApplicationContext来加载配置文件并创建IoC容器。 -
获取Bean:通过
context.getBean()获取装配好的Bean。 -
Bean的注入:Spring通过XML配置文件或Java代码注入Bean的依赖,支持构造器注入和Setter方法注入。
练习
在上述示例的基础上,尝试继续给UserService注入DataSource,并通过数据库实现用户的注册和登录功能。
通过这个简单的例子,我们学习了如何使用Spring IoC容器来管理对象的生命周期和依赖关系。在实际开发中,IoC容器不仅可以简化代码,还可以增强代码的可维护性和可测试性。
1840

被折叠的 条评论
为什么被折叠?



