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

Aware 接口

Aware接口是Spring提供的回调机制,让Bean获取容器内部资源。

接口层次结构

Java
Aware (顶层接口)
├── BeanNameAware
├── BeanFactoryAware
├── ApplicationContextAware
├── EnvironmentAware
├── ResourceLoaderAware
├── MessageSourceAware
├── ApplicationEventPublisherAware
├── ServletContextAware (Web环境)
└── ServletConfigAware (Web环境)

Aware接口列表

接口获取资源调用方法
BeanNameAwareBean名称setBeanName
BeanFactoryAwareBeanFactorysetBeanFactory
ApplicationContextAwareApplicationContextsetApplicationContext
EnvironmentAwareEnvironmentsetEnvironment
ResourceLoaderAwareResourceLoadersetResourceLoader
MessageSourceAwareMessageSourcesetMessageSource
ApplicationEventPublisherAwareEventPublishersetApplicationEventPublisher

实现示例

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框架回调机制的基础

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

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

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

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