掌握Spring BeanFactory:从基础到高级应用

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

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值