Spring BeanFactory体系全解

目录

  1. 引言
  2. BeanFactory接口体系
  3. BeanDefinition体系
  4. BeanPostProcessor后置处理器
  5. BeanFactoryPostProcessor扩展点
  6. FactoryBean与ObjectFactory
  7. BeanDefinitionRegistry注册中心
  8. 别名管理与BeanNameGenerator
  9. 源码流程解析
  10. 实战:自定义扩展
  11. 总结

引言

Spring框架的核心是IoC容器,而IoC容器的核心则是BeanFactory。理解BeanFactory及其相关接口的层次结构,是深入掌握Spring框架的必经之路。

本文将从源码层面深入剖析:

  • BeanFactory接口体系的完整设计
  • BeanDefinition如何描述Bean的元数据
  • BeanPostProcessor后置处理器的执行机制
  • BeanFactoryPostProcessor如何修改BeanDefinition
  • FactoryBean与普通Bean的区别
  • BeanDefinitionRegistry如何管理Bean注册

1. BeanFactory接口体系

1.1 核心接口层次

«interface»

BeanFactory

+getBean(name)

+getBean(type)

+getBean(name, type)

«interface»

ListableBeanFactory

+getBeanDefinitionNames()

+getBeansOfType(type)

«interface»

HierarchicalBeanFactory

+getParentBeanFactory()

+containsLocalBean(name)

«interface»

AutowireCapableBeanFactory

+createBean(type)

+autowire(bean)

+initializeBean(bean)

ApplicationContext

AbstractAutowireCapableBeanFactory

1.2 BeanFactory根接口

public interface BeanFactory {
    
    /**
     * Bean名称前缀常量
     */
    String FACTORY_BEAN_PREFIX = "&";
    
    /**
     * 根据名称获取Bean
     * @throws NoSuchBeanDefinitionException 如果不存在
     */
    Object getBean(String name) throws BeansException;
    
    /**
     * 根据名称和类型获取Bean
     */
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    
    /**
     * 根据类型获取Bean
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;
    
    /**
     * 检查Bean是否存在
     */
    boolean containsBean(String name);
    
    /**
     * 获取Bean的作用域
     */
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    
    /**
     * 检查Bean类型
     */
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws BeansException;
    
    /**
     * 获取Bean的类型
     */
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    
    /**
     * 获取Bean的所有别名
     */
    String[] getAliases(String name);
}

1.3 ListableBeanFactory接口

public interface ListableBeanFactory extends BeanFactory {
    
    /**
     * 检查是否包含指定类型的Bean
     */
    boolean containsBeanDefinition(Class<?> beanClass);
    
    /**
     * 获取所有BeanDefinition的数量
     */
    int getBeanDefinitionCount();
    
    /**
     * 获取所有BeanDefinition的名称
     */
    String[] getBeanDefinitionNames();
    
    /**
     * 根据类型获取Bean名称数组
     */
    String[] getBeanNamesForType(ResolvableType type);
    
    /**
     * 根据类型获取Bean实例
     */
    <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
    
    /**
     * 根据注解获取Bean名称
     */
    String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
    
    /**
     * 根据注解获取Bean
     */
    Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType)
        throws BeansException;
    
    /**
     * 查找指定Bean上的注解
     */
    <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
        throws NoSuchBeanDefinitionException;
}

1.4 HierarchicalBeanFactory接口

public interface HierarchicalBeanFactory extends BeanFactory {
    
    /**
     * 获取父BeanFactory
     */
    BeanFactory getParentBeanFactory();
    
    /**
     * 检查当前容器是否包含指定Bean(不包含父容器)
     */
    boolean containsLocalBean(String name);
}

1.5 AutowireCapableBeanFactory接口

public interface AutowireCapableBeanFactory extends BeanFactory {
    
    /**
     * 初始化Bean
     */
    Object initializeBean(Object existingBean, String beanName);
    
    /**
     * 配置Bean(属性填充、自动装配、初始化)
     */
    void configureBean(Object existingBean);
    
    /**
     * 创建Bean(通过自动装配)
     */
    <T> T createBean(Class<T> beanClass);
    
    /**
     * 销毁Bean
     */
    void destroyBean(Object existingBean);
    
    /**
     * 解析Bean名称
     */
    String resolveBeanName(String beanName);
    
    /**
     * 应用BeanPostProcessor
     */
    Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
        throws BeansException;
    
    Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
        throws BeansException;
}

2. BeanDefinition体系

2.1 BeanDefinition接口

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    
    // Bean作用域常量
    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    
    // ==================== Bean角色 ====================
    
    /**
     * Bean角色 - 应用程序主要Bean
     */
    int ROLE_APPLICATION = 0;
    
    /**
     * Bean角色 - 支持Bean(辅助配置)
     */
    int ROLE_SUPPORT = 1;
    
    /**
     * Bean角色 - 基础架构Bean
     */
    int ROLE_INFRASTRUCTURE = 2;
    
    // ==================== BeanDefinition属性 ====================
    
    void setBeanClassName(String beanClassName);
    String getBeanClassName();
    
    void setScope(String scope);
    String getScope();
    
    void setLazyInit(boolean lazyInit);
    boolean isLazyInit();
    
    void setDependsOn(String... dependsOn);
    String[] getDependsOn();
    
    void setAutowireCandidate(boolean autowireCandidate);
    boolean isAutowireCandidate();
    
    void setPrimary(boolean primary);
    boolean isPrimary();
    
    // ==================== 工厂方法 ====================
    
    void setFactoryBeanName(String factoryBeanName);
    String getFactoryBeanName();
    
    void setFactoryMethodName(String factoryMethodName);
    String getFactoryMethodName();
    
    // ==================== 构造参数 ====================
    
    ConstructorArgumentValues getConstructorArgumentValues();
    default boolean hasConstructorArgumentValues() {
        return !getConstructorArgumentValues().isEmpty();
    }
    
    // ==================== 属性值 ====================
    
    MutablePropertyValues getPropertyValues();
    default boolean hasPropertyValues() {
        return !getPropertyValues().isEmpty();
    }
    
    // ==================== 生命周期回调 ====================
    
    void setInitMethodName(String initMethodName);
    String getInitMethodName();
    
    void setDestroyMethodName(String destroyMethodName);
    String getDestroyMethodName();
    
    void setRole(int role);
    int getRole();
    
    void setDescription(String description);
    String getDescription();
    
    // ==================== 来源信息 ====================
    
    ResolvableType getResolvableType();
    boolean isSingleton();
    boolean isPrototype();
    boolean isAbstract();
    ConfigurableBeanFactory getParentName();
}

2.2 BeanDefinition实现类层次

BeanDefinition (接口)
    │
    ├── AbstractBeanDefinition (抽象基类)
    │       │
    │       ├── RootBeanDefinition (根Bean定义)
    │       │       │
    │       │       └── ChildBeanDefinition (子Bean定义,已废弃)
    │       │
    │       ├── GenericBeanDefinition (通用Bean定义)
    │       │
    │       └── AnnotatedBeanDefinition (带注解元数据的Bean定义)
    │               │
    │               └── ScannedGenericBeanDefinition (@Component扫描)
    │               │
    │               └── ConfigurationClassBeanDefinition (@Bean方法)

2.3 RootBeanDefinition

public class RootBeanDefinition extends AbstractBeanDefinition {
    
    // 可合并的Bean定义
    private BeanDefinitionHolder targetDefinition;
    
    // 内部使用的Bean定义
    private BeanDefinition[] innerDefinitions;
    
    // 构造函数参数
    private ConstructorArgumentValues constructorArgumentValues;
    
    public RootBeanDefinition(Class<?> beanClass) {
        super();
        setBeanClass(beanClass);
    }
    
    public RootBeanDefinition(String beanClassName) {
        super();
        setBeanClassName(beanClassName);
    }
    
    public RootBeanDefinition(BeanDefinition original) {
        super(original);
    }
    
    // 合并其他BeanDefinition
    public void setTargetDefinition(BeanDefinitionHolder targetDefinition) {
        this.targetDefinition = targetDefinition;
    }
}

2.4 GenericBeanDefinition

public class GenericBeanDefinition extends AbstractBeanDefinition {
    
    // 父Bean名称
    private String parentName;
    
    public GenericBeanDefinition() {
        super();
    }
    
    public GenericBeanDefinition(BeanDefinition original) {
        super(original);
        if (original instanceof GenericBeanDefinition) {
            this.parentName = ((GenericBeanDefinition) original).parentName;
        }
    }
    
    @Override
    public void setParentName(String parentName) {
        this.parentName = parentName;
    }
    
    @Override
    public String getParentName() {
        return this.parentName;
    }
    
    /**
     * 从GenericBeanDefinition创建RootBeanDefinition
     * 这是Spring容器处理BeanDefinition的标准方式
     */
    public RootBeanDefinition toRootBeanDefinition() {
        RootBeanDefinition rbd = new RootBeanDefinition(this);
        rbd.setTargetDefinition(this);
        return rbd;
    }
}

2.5 AnnotatedBeanDefinition

public interface AnnotatedBeanDefinition extends BeanDefinition {
    
    /**
     * 获取该Bean的注解元数据
     */
    AnnotationMetadata getMetadata();
    
    /**
     * 获取@Bean方法的元数据
     */
    MethodMetadata getFactoryMethodMetadata();
}
public class ScannedGenericBeanDefinition 
        extends GenericBeanDefinition 
        implements AnnotatedBeanDefinition {
    
    private final AnnotationMetadata metadata;
    private AnnotationMetadata factoryMethodMetadata;
    
    public ScannedGenericBeanDefinition(MetadataReader metadataReader) {
        this.metadata = metadataReader.getAnnotationMetadata();
        
        // 从@Component注解获取Bean名称
        setBeanClassName(determineBeanClassName(metadata));
        
        // 设置默认作用域
        setScope(determineScope(metadata));
    }
    
    @Override
    public AnnotationMetadata getMetadata() {
        return this.metadata;
    }
    
    @Override
    public void setFactoryMethodMetadata(AnnotationMetadata factoryMethodMetadata) {
        this.factoryMethodMetadata = factoryMethodMetadata;
    }
}

3. BeanPostProcessor后置处理器

3.1 接口定义

public interface BeanPostProcessor {
    
    /**
     * Bean初始化之前调用
     * @param bean 原始Bean实例
     * @param beanName Bean名称
     * @return 处理后的Bean(可以是原始Bean或代理对象)
     */
    @Nullable
    default Object postProcessBeforeInitialization(
            Object bean, String beanName) throws BeansException {
        return bean;
    }
    
    /**
     * Bean初始化之后调用
     * @param bean 已初始化的Bean实例
     * @param beanName Bean名称
     * @return 处理后的Bean(可以是原始Bean或代理对象)
     */
    @Nullable
    default Object postProcessAfterInitialization(
            Object bean, String beanName) throws BeansException {
        return bean;
    }
}

3.2 执行时机

BeanPostProcessor执行时序图:

┌─────────────────────────────────────────────────────────────────┐
│                    Bean初始化完整流程                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  Bean实例化                                                      │
│       │                                                           │
│       ▼                                                           │
│  ┌─────────────────────────────────────┐                         │
│  │ 实例化前处理                          │                         │
│  │ InstantiationAwareBeanPostProcessor  │                         │
│  │ .postProcessBeforeInstantiation()  │                         │
│  └─────────────┬───────────────────────┘                         │
│                │                                                   │
│                ▼                                                   │
│  构造函数执行(new)                                               │
│       │                                                           │
│       ▼                                                           │
│  ┌─────────────────────────────────────┐                         │
│  │ 实例化后处理                          │                         │
│  │ InstantiationAwareBeanPostProcessor  │                         │
│  │ .postProcessAfterInstantiation()   │                         │
│  └─────────────┬───────────────────────┘                         │
│                │                                                   │
│                ▼                                                   │
│  属性填充(@Autowired, @Value等)                                  │
│       │                                                           │
│       ▼                                                           │
│  ┌─────────────────────────────────────┐                         │
│  │ 初始化前处理                          │ ← BeanPostProcessor    │
│  │ .postProcessBeforeInitialization()  │   .postProcessBefore    │
│  └─────────────┬───────────────────────┘                         │
│                │                                                   │
│                ▼                                                   │
│  初始化(InitializingBean, init-method)                            │
│       │                                                           │
│       ▼                                                           │
│  ┌─────────────────────────────────────┐                         │
│  │ 初始化后处理                          │ ← BeanPostProcessor    │
│  │ .postProcessAfterInitialization()   │   .postProcessAfter     │
│  └─────────────┬───────────────────────┘                         │
│                │                                                   │
│                ▼                                                   │
│  Bean就绪                                                      │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

3.3 内置BeanPostProcessor

Spring框架内置了多个重要的BeanPostProcessor

// 1. AutowiredAnnotationBeanPostProcessor
// 处理@Autowired、@Value注解
class AutowiredAnnotationBeanPostProcessor 
        extends InstantiationAwareBeanPostProcessorAdapter {
    
    private final AutowiredAnnotationBeanInfo attributeInfo;
    
    @Override
    public PropertyValues postProcessProperties(
            PropertyValues pvs, Object bean, String beanName) {
        // 1. 查找带@Autowired的属性
        // 2. 执行依赖注入
        // 3. 返回处理后的PropertyValues
    }
}

// 2. CommonAnnotationBeanPostProcessor
// 处理@Resource、@PostConstruct、@PreDestroy
class CommonAnnotationBeanPostProcessor 
        extends InstantiationAwareBeanPostProcessorAdapter {
    
    @Override
    public PropertyValues postProcessProperties(
            PropertyValues pvs, Object bean, String beanName) {
        // 处理@Resource注解
    }
}

// 3. RequiredAnnotationBeanPostProcessor
// 检查@Required注解(Spring 5.1已废弃)
class RequiredAnnotationBeanPostProcessor 
        extends AbstractBeanFactoryAwareAdvisingPostProcessor {
    // ...
}

// 4. ApplicationContextAwareProcessor
// 注入ApplicationContext等感知接口
class ApplicationContextAwareProcessor 
        implements BeanPostProcessor {
    
    @Override
    public Object postProcessBeforeInitialization(
            Object bean, String beanName) {
        
        if (bean instanceof EnvironmentAware) {
            ((EnvironmentAware) bean).setEnvironment(
                getEnvironment());
        }
        if (bean instanceof EmbeddedValueResolverAware) {
            // ...
        }
        if (bean instanceof ResourceLoaderAware) {
            // ...
        }
        if (bean instanceof ApplicationEventPublisherAware) {
            // ...
        }
        if (bean instanceof MessageSourceAware) {
            // ...
        }
        if (bean instanceof ApplicationContextAware) {
            ((ApplicationContextAware) bean).setApplicationContext(
                getApplicationContext());
        }
        return bean;
    }
}

// 5. AsyncAnnotationBeanPostProcessor
// 处理@Async注解
class AsyncAnnotationBeanPostProcessor 
        extends AbstractBeanFactoryAwareAdvisingPostProcessor {
    // ...
}

3.4 自定义BeanPostProcessor

@Component
public class TimingBeanPostProcessor implements BeanPostProcessor {
    
    @Override
    public Object postProcessBeforeInitialization(
            Object bean, String beanName) {
        // 可以在初始化前做一些处理
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(
            Object bean, String beanName) {
        
        // 记录Bean创建时间
        System.out.println("Bean创建完成: " + beanName + 
            ", 类型: " + bean.getClass().getName());
        
        // 返回原始Bean或代理对象
        return bean;
    }
}

3.5 代理后置处理器

最重要的BeanPostProcessor——创建AOP代理:

class AutowiredAnnotationBeanPostProcessor 
        extends InstantiationAwareBeanPostProcessorAdapter {
    
    // ...
}

// 真正的代理创建由AnnotationAwareAspectJAutoProxyCreator完成
public class AnnotationAwareAspectJAutoProxyCreator 
        extends AspectJAwareAdvisorAutoProxyCreator {
    
    @Override
    public Object postProcessAfterInitialization(
            Object bean, String beanName) {
        
        // 如果需要代理,创建代理
        if (this.advisedBeans.isEligible(beanName, bean)) {
            // 创建代理
            return createProxy(
                bean.getClass(), beanName, 
                this.advisors, new SingletonTargetSource(bean));
        }
        
        return bean;
    }
}

4. BeanFactoryPostProcessor扩展点

4.1 接口定义

@FunctionalInterface
public interface BeanFactoryPostProcessor {
    
    /**
     * 在容器实例化Bean之前修改BeanDefinition
     * @param beanFactory BeanFactory
     */
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
        throws BeansException;
}

4.2 BeanFactoryPostProcessor vs BeanPostProcessor

┌─────────────────────────────────────────────────────────────────┐
│           BeanFactoryPostProcessor vs BeanPostProcessor          │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  BeanFactoryPostProcessor:                                       │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │ 执行时机:BeanDefinition加载后,Bean实例化前                  ││
│  │ 作用对象:BeanDefinition(Bean的蓝图)                       ││
│  │ 典型应用:修改Bean属性值、注册新的BeanDefinition              ││
│  │ 执行次数:每个BeanFactoryPostProcessor只执行一次            ││
│  └─────────────────────────────────────────────────────────────┘│
│                                                                  │
│  BeanPostProcessor:                                              │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │ 执行时机:Bean实例化后,初始化前后                           ││
│  │ 作用对象:Bean实例                                          ││
│  │ 典型应用:依赖注入、AOP代理、属性转换                        ││
│  │ 执行次数:每个Bean实例创建时都会执行                        ││
│  └─────────────────────────────────────────────────────────────┘│
│                                                                  │
│  执行顺序:                                                       │
│  BeanFactoryPostProcessor → Bean实例化 → BeanPostProcessor     │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

4.3 内置BeanFactoryPostProcessor

// 1. PropertySourcesPlaceholderConfigurer
// 处理${...}占位符
class PropertySourcesPlaceholderConfigurer 
        extends PlaceholderConfigurerSupport 
        implements BeanFactoryPostProcessor {
    
    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) {
        
        // 1. 加载属性源
        PropertySources propertySources = getAppliedPropertySources();
        
        // 2. 遍历所有BeanDefinition
        String[] beanNames = beanFactory.getBeanDefinitionNames();
        for (String beanName : beanNames) {
            BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
            
            // 3. 替换BeanDefinition中的占位符
            resolveProperties(bd);
        }
    }
}

// 2. PropertyOverrideConfigurer
// 覆盖Bean属性
class PropertyOverrideConfigurer 
        extends PropertySourcesPlaceholderConfigurer {
    
    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) {
        // 从配置文件中覆盖Bean属性值
    }
}

// 3. CustomEditorConfigurer
// 注册属性编辑器
class CustomEditorConfigurer 
        implements BeanFactoryPostProcessor {
    
    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) {
        
        // 注册自定义属性编辑器
        beanFactory.addPropertyEditorRegistrar(registry -> {
            registry.registerCustomEditor(Date.class, 
                new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));
        });
    }
}

4.4 自定义BeanFactoryPostProcessor

@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) {
        
        // 1. 获取所有BeanDefinition
        String[] beanNames = beanFactory.getBeanDefinitionNames();
        
        for (String beanName : beanNames) {
            BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
            
            // 2. 修改BeanDefinition属性
            if (bd.getBeanClassName() != null 
                && bd.getBeanClassName().contains("Service")) {
                
                // 设置懒加载
                bd.setLazyInit(true);
                
                // 设置依赖
                bd.setDependsOn("loggingService");
            }
        }
        
        // 3. 注册新的BeanDefinition
        GenericBeanDefinition newBd = new GenericBeanDefinition();
        newBd.setBeanClass(MyHelperService.class);
        beanFactory.registerBeanDefinition(
            "myHelperService", newBd);
    }
}

4.5 BeanDefinitionRegistryPostProcessor

更强大的扩展点,可以添加新的BeanDefinition:

public interface BeanDefinitionRegistryPostProcessor 
        extends BeanFactoryPostProcessor {
    
    /**
     * 在标准BeanFactoryPostProcessor之前执行
     * 可以注册新的BeanDefinition
     */
    void postProcessBeanDefinitionRegistry(
            BeanDefinitionRegistry registry) throws BeansException;
}
@Component
public class CustomBeanDefinitionRegistryPostProcessor 
        implements BeanDefinitionRegistryPostProcessor {
    
    @Override
    public void postProcessBeanDefinitionRegistry(
            BeanDefinitionRegistry registry) {
        
        // 在这里可以添加、修改、移除BeanDefinition
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(MyBean.class);
        beanDefinition.setPropertyValues(new MutablePropertyValues() {{
            add("name", "default");
        }});
        
        registry.registerBeanDefinition("myBean", beanDefinition);
    }
    
    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) {
        // 标准BeanFactoryPostProcessor逻辑
    }
}

5. FactoryBean与ObjectFactory

5.1 FactoryBean接口

public interface FactoryBean<T> {
    
    /**
     * 返回创建的Bean对象
     */
    T getObject() throws Exception;
    
    /**
     * 返回创建的Bean类型
     */
    Class<?> getObjectType();
    
    /**
     * 是否是单例
     */
    default boolean isSingleton() {
        return true;
    }
}

5.2 FactoryBean vs BeanFactory

┌─────────────────────────────────────────────────────────────────┐
│              FactoryBean vs BeanFactory                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  BeanFactory:IoC容器(工厂)                                      │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │ Spring IoC容器的核心接口                                     ││
│  │ 管理所有Bean的创建和生命周期                                 ││
│  │ getBean() → 返回Bean实例                                    ││
│  └─────────────────────────────────────────────────────────────┘│
│                                                                  │
│  FactoryBean:Bean的工厂(产品)                                  │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │ 一个特殊的Bean,用于创建复杂Bean                             ││
│  │ 创建的Bean由Spring管理生命周期                               ││
│  │ getBean("&beanName") → 返回FactoryBean本身                  ││
│  │ getBean("beanName") → 返回getObject()创建的对象             ││
│  └─────────────────────────────────────────────────────────────┘│
│                                                                  │
│  使用场景:                                                       │
│  • 创建第三方库的Bean                                            │
│  • 创建需要复杂初始化的Bean                                      │
│  • 创建代理对象                                                 │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

5.3 FactoryBean使用示例

// 示例1:创建SqlSessionFactory
public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory> {
    
    private String configLocation;
    private String dataSource;
    
    @Override
    public SqlSessionFactory getObject() throws Exception {
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        return builder.build(loadConfig());
    }
    
    @Override
    public Class<SqlSessionFactory> getObjectType() {
        return SqlSessionFactory.class;
    }
    
    @Override
    public boolean isSingleton() {
        return true;
    }
}

// 使用
@Bean
public SqlSessionFactoryBean sqlSessionFactory() {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setConfigLocation("classpath:mybatis-config.xml");
    return factory;
}
// 示例2:创建动态代理
public class JdkProxyFactoryBean implements FactoryBean<Object> {
    
    private Object target;
    private Class<?> interfaceClass;
    
    @Override
    public Object getObject() throws Exception {
        return Proxy.newProxyInstance(
            interfaceClass.getClassLoader(),
            new Class[] { interfaceClass },
            (proxy, method, args) -> {
                // 代理逻辑
                System.out.println("调用方法: " + method.getName());
                return method.invoke(target, args);
            }
        );
    }
    
    @Override
    public Class<?> getObjectType() {
        return interfaceClass;
    }
}

5.4 获取FactoryBean本身

@Autowired
private BeanFactory beanFactory;

// 获取FactoryBean本身(以&开头)
@Test
public void testGetFactoryBeanItself() {
    // 获取sqlSessionFactory这个FactoryBean本身
    Object factory = beanFactory.getBean("&sqlSessionFactory");
    assertTrue(factory instanceof SqlSessionFactoryBean);
    
    // 获取FactoryBean创建的SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = beanFactory.getBean("sqlSessionFactory");
    assertTrue(sqlSessionFactory instanceof SqlSessionFactory);
}

5.5 ObjectFactory接口

@FunctionalInterface
public interface ObjectFactory<T> {
    
    /**
     * 创建或获取对象
     */
    T getObject();
}
// ObjectFactory的使用场景:延迟初始化
@Component
public class LazyBeanReference {
    
    @Autowired
    private ObjectFactory<HeavyService> heavyServiceFactory;
    
    public void doSomething() {
        // 真正需要时才创建HeavyService
        HeavyService service = heavyServiceFactory.getObject();
        service.process();
    }
}

6. BeanDefinitionRegistry注册中心

6.1 接口定义

public interface BeanDefinitionRegistry 
        extends AliasRegistry {
    
    /**
     * 注册新的BeanDefinition
     */
    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();
    
    /**
     * 获取BeanDefinition数量
     */
    int getBeanDefinitionCount();
    
    /**
     * 检查Bean名称是否已使用
     */
    boolean isBeanNameInUse(String beanName);
}

6.2 AliasRegistry接口

public interface AliasRegistry {
    
    /**
     * 注册别名
     */
    void registerAlias(String name, String alias);
    
    /**
     * 移除别名
     */
    void removeAlias(String alias);
    
    /**
     * 判断是否是别名
     */
    boolean isAlias(String name);
    
    /**
     * 获取别名列表
     */
    String[] getAliases(String name);
}

6.3 实现类:DefaultListableBeanFactory

public class DefaultListableBeanFactory 
        extends AbstractAutowireCapableBeanFactory
        implements ConfigurableListableBeanFactory, 
                   BeanDefinitionRegistry {
    
    // BeanDefinition注册表
    private final Map<String, BeanDefinition> beanDefinitionMap = 
        new ConcurrentHashMap<>(256);
    
    // Bean名称列表(按注册顺序)
    private volatile List<String> beanDefinitionNames = 
        new ArrayList<>(256);
    
    @Override
    public void registerBeanDefinition(String beanName, 
                                        BeanDefinition beanDefinition) {
        
        // 1. 校验BeanDefinition
        if (beanDefinition instanceof AbstractBeanDefinition) {
            ((AbstractBeanDefinition) beanDefinition).validate();
        }
        
        // 2. 检查是否已存在
        BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
        if (existingDefinition != null) {
            // 覆盖或报错
            if (!existingDefinition.equals(beanDefinition)) {
                this.beanDefinitionMap.put(beanName, beanDefinition);
            }
        } else {
            // 3. 注册新的BeanDefinition
            if (hasBeanCreationStarted()) {
                // 容器已启动,需要同步
                synchronized (this.beanDefinitionMap) {
                    this.beanDefinitionMap.put(beanName, beanDefinition);
                    this.beanDefinitionNames.add(beanName);
                }
            } else {
                // 容器未启动
                this.beanDefinitionMap.put(beanName, beanDefinition);
                this.beanDefinitionNames.add(beanName);
            }
        }
    }
    
    @Override
    public BeanDefinition getBeanDefinition(String beanName) {
        BeanDefinition bd = this.beanDefinitionMap.get(beanName);
        if (bd == null) {
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("No bean named '" + beanName + "' found in " + this);
            }
            throw new NoSuchBeanDefinitionException(beanName);
        }
        return bd;
    }
}

7. 别名管理与BeanNameGenerator

7.1 别名注册

// 方式1:通过@Bean注册别名
@Configuration
public class AppConfig {
    @Bean(name = {"userService", "userServiceAlias", "us"})
    public UserService userService() {
        return new UserServiceImpl();
    }
}

// 方式2:通过@Qualifier指定别名
@Service("userService")
public class UserServiceImpl implements UserService {}

@Service
public class AnotherService {
    @Autowired
    @Qualifier("userServiceAlias")
    private UserService userService;
}

// 方式3:使用AliasRegistry
@Component
public class AliasRegistrar implements BeanDefinitionRegistryPostProcessor {
    
    @Override
    public void postProcessBeanDefinitionRegistry(
            BeanDefinitionRegistry registry) {
        // 注册别名
        registry.registerAlias("userService", "userServiceAlias");
        registry.registerAlias("userService", "us");
    }
}

7.2 BeanNameGenerator

public interface BeanNameGenerator {
    
    /**
     * 生成Bean名称
     * @param definition Bean定义
     * @param registry BeanDefinitionRegistry
     * @return Bean名称
     */
    String generateBeanName(BeanDefinition definition, 
                           BeanDefinitionRegistry registry);
}
// Spring内置的默认实现
public class AnnotationBeanNameGenerator implements BeanNameGenerator {
    
    @Override
    public String generateBeanName(
            BeanDefinition definition,
            BeanDefinitionRegistry registry) {
        
        if (definition instanceof AnnotatedBeanDefinition) {
            // 从注解中获取Bean名称
            String beanName = determineBeanNameFromAnnotation(
                ((AnnotatedBeanDefinition) definition).getMetadata());
            if (StringUtils.hasText(beanName)) {
                return beanName;
            }
        }
        
        // 使用类的简名作为Bean名称
        return buildDefaultBeanName(definition, registry);
    }
    
    protected String buildDefaultBeanName(
            BeanDefinition definition,
            BeanDefinitionRegistry registry) {
        
        String beanClassName = definition.getBeanClassName();
        Assert.state(beanClassName != null, "Bean class name must not be null");
        
        // UserServiceImpl → userServiceImpl
        // UserService → userService
        return Introspector.decapitalize(
            ClassUtils.getShortName(beanClassName));
    }
}

7.3 自定义BeanNameGenerator

// 示例1:带前缀的Bean名称
public class PrefixedBeanNameGenerator implements BeanNameGenerator {
    
    private String prefix = "app.";
    
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }
    
    @Override
    public String generateBeanName(
            BeanDefinition definition,
            BeanDefinitionRegistry registry) {
        
        BeanDefinitionGenerator generator = 
            new AnnotationBeanNameGenerator();
        String name = generator.generateBeanName(definition, registry);
        return prefix + name;
    }
}

// 配置使用
@Configuration
@ComponentScan(
    nameGenerator = PrefixedBeanNameGenerator.class)
public class AppConfig {}

// 结果:所有Bean名称都会带"app."前缀

8. 源码流程解析

8.1 容器初始化完整流程

┌─────────────────────────────────────────────────────────────────┐
│              DefaultListableBeanFactory 初始化流程                │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  1. 创建DefaultListableBeanFactory                               │
│       │                                                           │
│       ▼                                                           │
│  2. 设置parentBeanFactory                                         │
│       │                                                           │
│       ▼                                                           │
│  3. customizeBeanFactory()                                        │
│       │  ├─ 设置allowBeanDefinitionOverriding                   │
│       │  ├─ 设置allowCircularReferences                        │
│       │  └─ 设置securityContextProvider                         │
│       │                                                           │
│       ▼                                                           │
│  4. loadBeanDefinitions()                                        │
│       │                                                           │
│       ├─ XML: XmlBeanDefinitionReader.loadBeanDefinitions()     │
│       │                                                          │
│       └─ 注解: AnnotatedBeanDefinitionReader.registerBean()   │
│       │                                                           │
│       ▼                                                           │
│  5. BeanFactoryPostProcessor执行                                  │
│       │  ├─ BeanDefinitionRegistryPostProcessor                │
│       │  └─ BeanFactoryPostProcessor                           │
│       │                                                           │
│       ▼                                                           │
│  6. BeanDefinition合并                                           │
│       │  └─ RootBeanDefinition = ChildBeanDefinition + Parent │
│       │                                                           │
│       ▼                                                           │
│  7. BeanPostProcessor注册                                         │
│       │  └─ 添加到beanPostProcessors列表                       │
│       │                                                           │
│       ▼                                                           │
│  8. 初始化MessageSource                                          │
│       │                                                           │
│       ▼                                                           │
│  9. 初始化事件多播器                                              │
│       │                                                           │
│       ▼                                                           │
│  10. onRefresh() → WebServer创建                                  │
│       │                                                           │
│       ▼                                                           │
│  11. finishRefresh()                                             │
│       │  ├─ clearResourceCaches()                              │
│       │  ├─ initLifecycleProcessor()                            │
│       │  ├─ publishEvent(new ContextRefreshedEvent())          │
│       │  └─ LiveBeansView.registerApplicationContext()        │
│       │                                                           │
│  12. resetCommonCaches()                                         │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

8.2 getBean()核心逻辑

// AbstractBeanFactory.getBean()
@Override
public Object getBean(String name) throws BeansException {
    return doGetBean(name, null, null, false);
}

protected <T> T doGetBean(
        String name,
        Class<T> requiredType,
        Object[] args,
        boolean typeCheckOnly) throws BeansException {
    
    // 1. 转换Bean名称(处理&前缀)
    String beanName = transformedBeanName(name);
    
    // 2. 尝试从单例缓存获取
    Object bean = getSingleton(beanName);
    if (bean != null) {
        // 单例Bean直接返回
        return getObjectForBeanInstance(bean, name, beanName, null);
    }
    
    // 3. 原型Bean处理
    if (isPrototypeCurrentlyInCreation(beanName)) {
        throw new BeanCurrentlyInCreationException(beanName);
    }
    
    // 4. 检查父容器
    BeanFactory parentBeanFactory = getParentBeanFactory();
    if (parentBeanFactory != null) {
        return parentBeanFactory.getBean(requiredType);
    }
    
    // 5. 获取并合并BeanDefinition
    BeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
    
    // 6. 处理depends-on
    String[] dependsOn = mbd.getDependsOn();
    if (dependsOn != null) {
        for (String dep : dependsOn) {
            registerDependentBean(dep, beanName);
            getBean(dep);  // 先创建依赖的Bean
        }
    }
    
    // 7. 根据作用域创建Bean
    if (mbd.isSingleton()) {
        // 单例创建
        return createBean(beanName, mbd, args);
    } else if (mbd.isPrototype()) {
        // 原型创建
        return createBean(beanName, mbd, args);
    } else {
        // 其他作用域
        return createBean(beanName, mbd, args);
    }
}

9. 实战:自定义扩展

9.1 自定义BeanDefinitionRegistryPostProcessor

/**
 * 自动扫描并注册带特定注解的类为Bean
 */
@Component
public class CustomComponentRegistrar 
        implements BeanDefinitionRegistryPostProcessor {
    
    private static final String BASE_PACKAGE = "com.example.custom.beans";
    
    @Override
    public void postProcessBeanDefinitionRegistry(
            BeanDefinitionRegistry registry) {
        
        // 扫描指定包
        ClassPathScanner scanner = new ClassPathScanner(registry);
        scanner.setResourceLoader(new DefaultResourceLoader());
        scanner.scan(BASE_PACKAGE);
    }
    
    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) {
        // 可以在这里对BeanFactory进行后处理
    }
}

class ClassPathScanner {
    
    private final BeanDefinitionRegistry registry;
    private ResourceLoader resourceLoader;
    
    public ClassPathScanner(BeanDefinitionRegistry registry) {
        this.registry = registry;
    }
    
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }
    
    public void scan(String basePackage) {
        // 实现包扫描逻辑
        String packageSearchPath = "classpath:" + 
            basePackage.replace('.', '/') + "/**/*.class";
        
        // ... 扫描并注册BeanDefinition
    }
}

9.2 自定义属性编辑器

@Component
public class CustomEditorConfigurer 
        implements BeanFactoryPostProcessor {
    
    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) {
        
        beanFactory.addPropertyEditorRegistrar(registry -> {
            // 注册日期编辑器
            registry.registerCustomEditor(
                Date.class, 
                new CustomDateEditor(
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), 
                    false
                )
            );
            
            // 注册自定义类型编辑器
            registry.registerCustomEditor(
                Money.class, 
                new MoneyEditor()
            );
        });
    }
}

public class MoneyEditor extends PropertyEditorSupport {
    
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.hasText(text)) {
            String[] parts = text.split(" ");
            if (parts.length == 2) {
                setValue(new Money(
                    new BigDecimal(parts[0]), 
                    Currency.getInstance(parts[1])
                ));
            }
        }
    }
    
    @Override
    public String getAsText() {
        Money money = (Money) getValue();
        return money != null ? 
            money.getAmount() + " " + money.getCurrency() : "";
    }
}

总结

本文深入剖析了Spring BeanFactory体系的完整设计:

接口体系:

  • BeanFactory是根接口,定义了IoC容器的基本能力
  • ListableBeanFactory支持批量查询
  • HierarchicalBeanFactory支持层级结构
  • AutowireCapableBeanFactory支持自动装配

BeanDefinition体系:

  • BeanDefinition描述了Bean的元数据
  • RootBeanDefinition用于合并后的Bean定义
  • GenericBeanDefinition支持父子Bean
  • AnnotatedBeanDefinition支持注解元数据

后置处理器:

  • BeanPostProcessor在Bean初始化前后执行
  • BeanFactoryPostProcessor在Bean创建前修改BeanDefinition
  • BeanDefinitionRegistryPostProcessor可以注册新的BeanDefinition

FactoryBean:

  • FactoryBean用于创建复杂Bean
  • 通过&前缀可以获取FactoryBean本身
  • ObjectFactory支持延迟初始化

掌握这些核心接口和类,是深入理解Spring框架的必备知识。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐