ConfigurableBeanFactory(可配置的 Bean 工厂)
ConfigurableBeanFactory
接口提供了一些方法来配置 Bean 工厂的行为和属性,使得我们可以动态地管理和调整 Bean 工厂的配置,从而更好地满足应用程序的需求。通过对 Bean 工厂的配置,可以实现更灵活、更定制化的 Bean 管理方式。
源码展示
ConfigurableBeanFactory
接口提供了一系列操作 Bean 工厂的方法,使得我们可以动态地管理和调整 Bean 工厂的配置。
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
// 设置父 Bean 工厂
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
// 设置类加载器
void setBeanClassLoader(ClassLoader beanClassLoader);
// 获取类加载器
ClassLoader getBeanClassLoader();
// 设置是否缓存 bean 的元数据
void setCacheBeanMetadata(boolean cacheBeanMetadata);
// 是否缓存 bean 的元数据
boolean isCacheBeanMetadata();
// 设置 Bean 表达式解析器
void setBeanExpressionResolver(BeanExpressionResolver resolver);
// 获取 Bean 表达式解析器
BeanExpressionResolver getBeanExpressionResolver();
// 设置属性编辑器注册表
void setPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
// 获取属性编辑器注册表
PropertyEditorRegistrar getPropertyEditorRegistrar();
// 添加 BeanPostProcessor 实例
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
// 注册一个 Scope,用于管理作用域
void registerScope(String scopeName, Scope scope);
// 获取注册的 Scope
Scope getRegisteredScope(String scopeName);
// 获取当前 BeanFactory 使用的作用域集合
String[] getRegisteredScopeNames();
// 注册一个 BeanDefinition,将其添加到 BeanFactory 中
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;
// 移除指定名称的 BeanDefinition
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 获取指定名称的 BeanDefinition
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 判断是否包含指定名称的 BeanDefinition
boolean containsBeanDefinition(String beanName);
// 获取所有的 BeanDefinition 的名称
String[] getBeanDefinitionNames();
}
思考使用
对之前的UserService 接口和两个实现类:AdminUserService 和 RegularUserService。使用 ConfigurableBeanFactory 来注册 Bean 定义,并配置 Bean 的作用域和属性。
创建一个配置类 BeanConfig,在其中使用 ConfigurableBeanFactory 注册 Bean 定义并配置作用域:
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class BeanConfig {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) // 设置作用域为原型
public UserService regularUserService() {
return new RegularUserService();
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) // 设置作用域为单例
public UserService adminUserService() {
return new AdminUserService();
}
}
regularUserService()
方法配置了作用域为原型,即每次请求该 Bean 时都会创建一个新的实例;而 adminUserService()
方法配置了作用域为单例,即整个应用程序中只会创建一个实例。创建一个测试类来验证配置是否生效:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService regularUserService;
@Autowired
private UserService adminUserService;
@Test
public void testBeanScope() {
UserService user1 = regularUserService;
UserService user2 = regularUserService;
UserService user3 = adminUserService;
UserService user4 = adminUserService;
// 验证作用域是否生效
assertNotSame(user1, user2); // 不同的请求应该返回不同的实例
assertSame(user3, user4); // 单例作用域应该返回相同的实例
}
}
功能性理解
BeanFactory 是 Spring 框架中的一个核心接口,用于管理应用程序中的对象(也称为 bean)。它提供了一种将应用程序组件(如服务、数据源、控制器等)解耦并配置到应用程序中的方式。对 BeanFactory 的初步理解可以简单从以下几个方面来说说:
IoC 容器: BeanFactory 是 Spring 的 IoC 容器之一,IoC(Inverse of Control,控制反转)是一种设计模式,它将对象的创建和管理控制权从代码中转移到了容器中。BeanFactory 作为 IoC 容器的顶层抽象,负责创建、组装、配置和管理 bean 对象。
Bean 定义管理: BeanFactory 负责管理应用程序中的所有 bean 定义。这些 bean 定义通常是通过 XML 文件、注解或 Java 代码进行配置的。BeanFactory 负责解析这些配置信息,并在需要时实例化相应的 bean 对象。
延迟加载: BeanFactory 支持延迟加载机制,即只有在请求时才会实例化 bean 对象,这样可以提高应用程序的性能和资源利用率。在大型应用程序中,延迟加载可以避免在启动时加载大量的对象,从而加快应用程序的启动速度。
依赖注入: BeanFactory 实现了依赖注入(DI)机制,它负责解决 bean 之间的依赖关系。通过依赖注入,BeanFactory 可以在创建 bean 对象时自动将其依赖的其他 bean 对象注入到其中,从而实现了对象之间的解耦。
Bean 的作用域管理: BeanFactory 支持不同的 bean 作用域,如 singleton、prototype、request、session 等。通过配置不同的作用域,可以控制 bean 对象的生命周期,并确保在不同的作用域下能够正确地管理 bean 对象的创建和销毁。
总的来说,可以初步理解BeanFactory 为 Spring 框架中负责管理 bean 对象的核心组件,它通过 IoC 容器、延迟加载、依赖注入和作用域管理等机制,实现了对象之间的解耦和灵活配置,从而提高了应用程序的可维护性、可测试性和可扩展性。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xiaofeng10330111/article/details/136970813