Aware 接口
Aware接口是Spring提供的回调机制,让Bean获取容器内部资源。
接口层次结构
Java
Aware (顶层接口)
├── BeanNameAware
├── BeanFactoryAware
├── ApplicationContextAware
├── EnvironmentAware
├── ResourceLoaderAware
├── MessageSourceAware
├── ApplicationEventPublisherAware
├── ServletContextAware (Web环境)
└── ServletConfigAware (Web环境)
Aware接口列表
| 接口 | 获取资源 | 调用方法 |
|---|---|---|
| BeanNameAware | Bean名称 | setBeanName |
| BeanFactoryAware | BeanFactory | setBeanFactory |
| ApplicationContextAware | ApplicationContext | setApplicationContext |
| EnvironmentAware | Environment | setEnvironment |
| ResourceLoaderAware | ResourceLoader | setResourceLoader |
| MessageSourceAware | MessageSource | setMessageSource |
| ApplicationEventPublisherAware | EventPublisher | setApplicationEventPublisher |
实现示例
BeanNameAware
Java
@Component
public class MyBean implements BeanNameAware {
private String beanName;
@Override
public void setBeanName(String name) {
this.beanName = name;
System.out.println("Bean名称: " + name);
}
public String getBeanName() {
return beanName;
}
}
ApplicationContextAware
Java
@Component
public class ContextAwareBean implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context) {
this.context = context;
}
public void publishEvent(ApplicationEvent event) {
context.publishEvent(event);
}
public Object getBean(String name) {
return context.getBean(name);
}
public Environment getEnvironment() {
return context.getEnvironment();
}
}
EnvironmentAware
Java
@Component
public class EnvironmentAwareBean implements EnvironmentAware {
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public String getProperty(String key) {
return environment.getProperty(key);
}
public String getActiveProfile() {
return environment.getActiveProfiles()[0];
}
}
ResourceLoaderAware
Java
@Component
public class ResourceLoaderBean implements ResourceLoaderAware {
private ResourceLoader resourceLoader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
public Resource loadResource(String location) {
return resourceLoader.getResource(location);
}
public InputStream loadFile(String path) throws IOException {
return resourceLoader.getResource(path).getInputStream();
}
}
组合实现多个Aware接口
Java
@Component
public class FullAwareBean implements
BeanNameAware,
BeanFactoryAware,
ApplicationContextAware,
EnvironmentAware {
private String beanName;
private BeanFactory beanFactory;
private ApplicationContext context;
private Environment environment;
@Override
public void setBeanName(String name) {
this.beanName = name;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
@Override
public void setApplicationContext(ApplicationContext context) {
this.context = context;
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
}
调用时机
Java
┌─────────────────────────────────────┐
│ Bean实例化 │
├─────────────────────────────────────┤
│ 属性注入 │
├─────────────────────────────────────┤
│ Aware接口回调 ← 此时调用 │
├─────────────────────────────────────┤
│ BeanPostProcessor前置处理 │
├─────────────────────────────────────┤
│ @PostConstruct │
├─────────────────────────────────────┤
│ InitializingBean │
└─────────────────────────────────────┘
使用场景
text
@Component
public class EventPublisherBean implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public void notifyUserCreated(Long userId) {
publisher.publishEvent(new UserCreatedEvent(this, userId));
}
}
@Component
public class I18nBean implements MessageSourceAware {
private MessageSource messageSource;
@Override
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
public String getMessage(String code, Object[] args) {
return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
}
}
推荐替代方式
text
// 使用@Autowired替代Aware接口(推荐)
@Component
public class ModernBean {
@Autowired
private ApplicationContext context;
@Autowired
private Environment environment;
@Autowired
private ApplicationEventPublisher publisher;
@Value("${bean.name}")
private String beanNamePlaceholder;
}
| 方式 | 特点 | 推荐度 |
|---|---|---|
| Aware接口 | Spring特有,显式回调 | ★★★ |
| @Autowired | 标准注解,简洁 | ★★★★★ |
要点总结
- Aware接口让Bean获取容器内部资源
- 在属性注入后、初始化前调用
- BeanNameAware获取Bean名称
- ApplicationContextAware获取完整容器
- 推荐使用@Autowired替代Aware接口 -Aware是Spring框架回调机制的基础
📝 发现内容有误?点击此处直接编辑