Bean的管理
2026年2月7日大约 3 分钟
Bean的管理
在Spring框架中,Bean是由IoC(控制反转)容器管理的对象。IoC容器负责创建、配置和管理这些Bean的生命周期。
Bean的获取
有两种主要方式可以从IoC容器中获取Bean:
- 通过依赖注入(Dependency Injection, DI):这是最常用的方式,Spring会自动将所需的Bean注入到需要它们的类中。
- 因为简单这里就不再赘述。具体看前面依赖注入部分。
- 通过ApplicationContext:调用其
getBean方法手动从IoC容器中获取Bean。同时根据参数不同分为:- 根据Bean名称获取:
Object getBean(String name),返回类型为Object,需要进行强制类型转换。 - 根据Bean类型获取:
<T> getBean(Class<T> requiredType),返回指定类型的Bean。 - 根据Bean名称和类型获取:
<T> T getBean(String name, Class<T> requiredType),返回指定名称和类型的Bean。
- 根据Bean名称获取:
- 示例:
// 获取IoC容器对象
@Autowired
private ApplicationContext context;
// 根据名称获取Bean
UserService userServiceByName = (UserService) context.getBean("userService");
// 根据类型获取Bean
UserService userServiceByType = context.getBean(UserService.class);
// 根据名称和类型获取Bean
UserService userServiceByNameAndType = context.getBean("userService", UserService.class);注意
如果输出上面示例中的获取的Bean对象,会发现是同一个实例,这是因为Spring默认情况下,Bean是以单例模式管理的。
Bean的作用域
Spring中Bean的作用域决定了Bean实例的创建和管理方式。常见的作用域有:
| 作用域名称 | 说明 |
|---|---|
| singleton | 表示在整个Spring容器中同名Bean只有一个实例,默认作用域。(单例) |
| prototype | 表示每次使用Bean时都会创建一个新的实例。(非单例) |
| request | 表示每个请求都会创建一个新的实例。(Web,了解) |
| session | 表示每个会话都会创建一个新的实例。(Web,了解) |
| application | 表示每个应用范围内都会创建一个新的实例。(Web,了解) |
- 通过
@Scope注解来指定Bean的作用域,例如:
@Service
@Scope("prototype")
public class UserService {
// 业务逻辑方法
}第三方Bean (@Bean注解)
知识回顾
在IoC详解提到过,我们自己定义的类可以通过@Component及其衍生注解来声明为Bean对象。
也就是交给IoC容器管理。
但有些时候我们需要使用第三方库中的类作为Bean对象,这时可以通过@Bean注解来声明第三方Bean。
- 为了集中管理第三方Bean,通常会使用
@Configuration注解来声明一个配置类,在该类中定义多个@Bean方法来创建和配置第三方Bean。 - 示例:
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}上面示例中,我们创建了一个配置类AppConfig,在其中定义了一个restTemplate方法,并使用@Bean注解将其声明为一个Bean对象。
这样,在需要使用RestTemplate的地方,就可以通过依赖注入的方式来获取这个Bean对象了。
@Autowired
private RestTemplate restTemplate;注意
Bean的名称默认是方法名,也可以通过指定@Bean注解的name或value属性来指定Bean的名称。
例如:@Bean(name = "customRestTemplate")
补充说明
如果需要创建的Bean对象需要依赖其他Bean对象,可以在@Bean方法的参数列表中声明这些依赖,Spring会自动注入它们。
例如:
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate(DomeService domeService) {
System.out.println("依赖的DomeService对象: " + domeService);
return new RestTemplate();
}
}