Spring的容器托管了所有bean,实际项目中我们经常会用到容器中的功能资源,这时候就用到了 Spring Aware。简单来说,就是Spring Aware可以帮助你获取到Spring容器中的Bean或者其他资源。
Spring 提供的Aware接口如下:
BeanNameAware :获取到容器中Bean的名称
BeanFactoryAware :获得当前bean factory,这样可以调用容器的服务
ApplicationContextAware* :当前的ApplicationContext,这样可以调用容器的服务
MessageSourceAware :获得message source,这样可以获得文本信息
ApplicationEventPublisherAware :应用事件发布器,可以发布事件
ResourceLoaderAware :获得资源加载器,可以获得外部资源文件
Spring Aware的目的是为了让Bean获得Spring容器的服务。因为ApplicationContext接口集成了MessageSource接口、ApplicationEventPublisher接口和ResourceLoader接口,所以Bean继承ApplicationContextAware可以获得Spring容器的所有服务。
例子:
/** * spring工具类,可获取spring容器中的bean * create by en * at 2019/1/23 16:43 **/ @Component // 必须是 spring bean 才能成功执行下面方法 public class SpringUtil implements BeanFactoryAware { // 实现BeanFactoryAware,获取 BeanFactory private static BeanFactory beanFactory; // 重写 setBeanFactory 方法,获取 BeanFactory @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } public static <T> T getBean(Class<T> c) { return beanFactory.getBean(c); } public static <T> T getBean(String name) { return (T) beanFactory.getBean(name); } }
但是需要注意Spring Aware本来就是Spring设计用来框架内部使用的,若使用了Spring Aware,你的Bean将会和Aware框架耦合。