第2课_Spring实例化与管理Bean
热度🔥:39 免费课程
授课语音
掌握Spring Bean的实例化与管理方式
Spring框架的核心之一是IoC
(控制反转)容器,它负责管理应用中的所有Bean
的实例化、生命周期管理和依赖注入等。理解Spring Bean的实例化和管理方式对于开发高效且易于维护的Spring应用至关重要。
1. Spring Bean概述
在Spring中,Bean
是通过Spring容器管理的对象。Spring容器负责创建、初始化、配置和管理这些对象。开发者通过配置文件(如XML)或者注解来告诉Spring如何创建和管理Bean。
1.1 Spring Bean的生命周期
一个Spring Bean从创建到销毁经历多个阶段,Spring容器通过不同的方式管理Bean的生命周期:
- 实例化:Spring容器会根据配置(XML或注解)实例化Bean。
- 依赖注入:容器将必要的依赖注入到Bean中。
- 初始化:Spring会执行Bean的初始化方法(如果配置了
@PostConstruct
或自定义初始化方法)。 - 销毁:当容器关闭时,Spring会销毁Bean(如果配置了
@PreDestroy
或自定义销毁方法)。
2. Spring Bean的实例化方式
2.1 基于XML配置的实例化
Spring通过XML文件中的<bean>
标签来定义Bean,并指定Bean的类路径。
示例:XML配置方式实例化Bean
<bean id="userService" class="com.example.service.UserService">
<!-- 依赖注入 -->
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.example.dao.UserDao"/>
代码解释:
id
:指定Bean的唯一标识符。class
:指定Bean的实现类。property
:为Bean设置依赖注入的属性。
2.2 基于注解的实例化
Spring提供了注解方式来定义和管理Bean,减少了XML配置。使用@Component
、@Service
等注解定义Bean,并通过@Autowired
来进行自动注入。
示例:使用注解实例化Bean
@Component
public class UserService {
@Autowired
private UserDao userDao; // 自动注入UserDao
public void doSomething() {
userDao.save();
}
}
@Component
public class UserDao {
public void save() {
System.out.println("Saving user...");
}
}
代码解释:
@Component
:将类标记为Spring容器中的一个Bean。@Autowired
:自动注入UserDao
Bean。
2.3 Bean的Scope(作用域)
Spring的Bean
有多种作用域,默认是singleton
,即每个Spring容器中只有一个Bean实例。除了singleton
,Spring还提供了其他几种作用域:
- singleton:默认作用域,Spring容器中只存在一个Bean实例。
- prototype:每次请求都会创建一个新的Bean实例。
- request:每次HTTP请求都会创建一个新的Bean实例,适用于Web应用。
- session:每个HTTP会话都会创建一个新的Bean实例,适用于Web应用。
- application:整个Web应用共享一个Bean实例。
示例:指定Bean的作用域
<bean id="userService" class="com.example.service.UserService" scope="prototype"/>
3. Spring Bean的依赖注入方式
Spring支持多种方式的依赖注入,包括构造器注入、setter注入和字段注入。
3.1 构造器注入
构造器注入是通过构造方法将依赖项传递给Bean。Spring容器在创建Bean时会自动调用构造方法。
示例:构造器注入
@Component
public class UserService {
private final UserDao userDao;
// 构造器注入
@Autowired
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public void doSomething() {
userDao.save();
}
}
代码解释:
@Autowired
注解用于构造方法,Spring会自动注入UserDao
实例。
3.2 Setter注入
Setter注入是通过Setter方法来注入依赖项。
示例:Setter注入
@Component
public class UserService {
private UserDao userDao;
// Setter注入
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void doSomething() {
userDao.save();
}
}
代码解释:
@Autowired
注解用于Setter方法,Spring会自动注入UserDao
实例。
3.3 字段注入
字段注入是通过直接注入字段来实现的。
示例:字段注入
@Component
public class UserService {
@Autowired
private UserDao userDao; // 直接注入字段
public void doSomething() {
userDao.save();
}
}
代码解释:
@Autowired
注解直接用于字段,Spring会自动注入UserDao
实例。
4. Spring Bean的初始化与销毁方法
4.1 初始化方法
Spring提供了两种方式来指定Bean的初始化方法:
- 使用
@PostConstruct
注解。 - 在XML配置中使用
init-method
属性。
示例:初始化方法
@Component
public class UserService {
@PostConstruct
public void init() {
System.out.println("UserService 初始化方法");
}
}
代码解释:
@PostConstruct
:该方法会在Bean实例化并完成依赖注入之后执行。
4.2 销毁方法
Spring提供了两种方式来指定Bean的销毁方法:
- 使用
@PreDestroy
注解。 - 在XML配置中使用
destroy-method
属性。
示例:销毁方法
@Component
public class UserService {
@PreDestroy
public void destroy() {
System.out.println("UserService 销毁方法");
}
}
代码解释:
@PreDestroy
:该方法会在容器销毁Bean之前执行。
5. 总结
- Spring Bean的实例化:可以通过XML配置或者注解方式进行实例化,支持单例和原型等多种作用域。
- 依赖注入:Spring支持构造器注入、Setter注入和字段注入等方式。
- 生命周期管理:Spring提供了初始化和销毁方法,分别通过
@PostConstruct
、@PreDestroy
和XML配置进行管理。 - 作用域管理:Spring支持多种作用域,如
singleton
、prototype
、request
等。
通过掌握Spring Bean的实例化与管理方式,可以更高效地开发和管理Spring应用,确保代码的可维护性和扩展性。