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声明式注入
- 需容器级别操作时才使用此接口
📝 发现内容有误?点击此处直接编辑