全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-18 5 分钟 ✍️ juanwangdev

BeanFactoryAware

BeanFactoryAware是Spring提供的Aware接口之一,用于让Bean获取BeanFactory引用。

接口定义

Java
public interface BeanFactoryAware extends Aware {
    void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}

实现示例

Java
@Component
public class MyBeanFactoryAwareBean implements BeanFactoryAware {

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    public void doSomething() {
        // 通过BeanFactory获取其他Bean
        UserService userService = beanFactory.getBean(UserService.class);

        // 检查Bean是否存在
        if (beanFactory.containsBean("orderService")) {
            OrderService orderService = beanFactory.getBean("orderService", OrderService.class);
        }

        // 获取Bean别名
        String[] aliases = beanFactory.getAliases("userService");

        // 判断是否单例
        boolean isSingleton = beanFactory.isSingleton("userService");
    }
}

调用时机

Java
┌─────────────────────────────────────┐
│  Bean实例化                          │
├─────────────────────────────────────┤
│  属性注入                            │
├─────────────────────────────────────┤
│  Aware接口回调 ← 此时调用             │
│  (BeanFactoryAware.setBeanFactory)  │
├─────────────────────────────────────┤
│  BeanPostProcessor前置处理           │
├─────────────────────────────────────┤
│  InitializingBean.afterPropertiesSet │
├─────────────────────────────────────┤
│  @PostConstruct                      │
├─────────────────────────────────────┤
│  BeanPostProcessor后置处理           │
└─────────────────────────────────────┘

BeanFactory常用方法

Java
// 获取Bean
Object getBean(String name);
T getBean(Class<T> requiredType);
T getBean(String name, Class<T> requiredType);

// 获取Provider(延迟获取)
ObjectProvider<T> getBeanProvider(Class<T> requiredType);

// 包含Bean判断
boolean containsBean(String name);

// 单例/原型判断
boolean isSingleton(String name);
boolean isPrototype(String name);

// 类型判断
boolean isTypeMatch(String name, Class<?> type);

// 获取类型
Class<?> getType(String name);

// 获取别名
String[] getAliases(String name);

与@Autowired对比

方式特点适用场景
BeanFactoryAware可动态获取Bean,访问容器功能需要容器级别操作
@Autowired声明式注入,简洁固定依赖注入

优先使用@Autowired,仅在需要容器功能时使用BeanFactoryAware。

使用场景

text
@Component
public class DynamicBeanLoader implements BeanFactoryAware {

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    // 根据条件动态获取Bean
    public Object getBeanByType(String beanType) {
        switch (beanType) {
            case "user":
                return beanFactory.getBean(UserService.class);
            case "order":
                return beanFactory.getBean(OrderService.class);
            default:
                return beanFactory.getBean("defaultService");
        }
    }

    // 检查Bean可用性
    public boolean isServiceAvailable(String serviceName) {
        return beanFactory.containsBean(serviceName);
    }
}

要点总结

  • BeanFactoryAware让Bean获取BeanFactory引用
  • setBeanFactory在属性注入后、初始化前调用
  • 可用于动态获取Bean、检查Bean存在性
  • 优先使用@Autowired声明式注入
  • 需容器级别操作时才使用此接口

📝 发现内容有误?点击此处直接编辑

← 上一篇 BeanDefinitionRegistryPostProcessor
下一篇 → BeanFactoryPostProcessor
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库