spring的aware学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/java_collect/article/details/82083186

简介

Spring提供的Aware接口能让Bean感知Spring容器的存在,即让Bean在初始化就可以使用Spring容器所提供的资源。
在spring中有许多继承aware接口的,常见的有:

接口 作用 备注
ApplicationContextAware 能获取Application Context调用容器的服务 常用
ApplicationEventPublisherAware 应用事件发布器,可以用来发布事件
BeanClassLoaderAware 能获取加载当前Bean的类加载器
BeanFactoryAware 能获取Bean Factory调用容器的服务
BeanNameAware 能获取当前Bean的名称
EnvironmentAware 能获取当前容器的环境属性信息 常用
MessageSourceAware 能获取国际化文本信息 常用
ResourceLoaderAware 获取资源加载器读取资源文件

常见用法

有时候会通过工具类的形式提供相应的能力如:

@Component//也要被spring管理
public class EventPublisherUtil implements ApplicationEventPublisherAware {

    private static ApplicationEventPublisher eventPublisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        if(eventPublisher == null){
            eventPublisher = applicationEventPublisher;
        }
    }

    /**
    * @description  发布事件
     */
    public static void publishEvent(ApplicationEvent event){
        eventPublisher.publishEvent(event);
    }
}

经常会使用到利用ApplicationContext 来获取bean,如下

public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(context == null){
            context = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext(){
        return context;
    }

    public static Object getBean(String name){
        return context.getBean(name);
    }

    public static <T> T getBean(Class<T> requiredType){
        return context.getBean(requiredType);
    }

    public static <T> T getBean(String name, Class<T> tclass){
        return context.getBean(name,tclass);
    }

    public static <T> Collection<T> fetchInteClassByT(Class<T> classes){
        return context.getBeansOfType(classes).values();
    }

    /**
    * @description  发布event
    */
    public static void publishEvent(ApplicationEvent event){
        getApplicationContext().publishEvent(event);
    }

}

因为ApplicationContext接口集成了MessageSource接口、ApplicationEventPublisher接口和ResourceLoader接口,所以Bean继承ApplicationContextAware可以获得Spring容器的所有服务,但是,原则上我们还是用到什么接口了,就实现什么接口。我们也需要在工作多总结,体会这些不同aware的使用场景,不断积累进步。

注意

除了通过实现Aware结尾接口获取spring内置对象,也可以通过@Autowired注解直接注入相关对象,如下:
(如果需要用到静态方法中,如工具方法,还是采用实现接口的方式)

@Autowired
private MessageSource messageSource; 

@Autowired
private ResourceLoader resourceLoader; 

@Autowired
private ApplicationContext applicationContext;

还有Spring Aware本来就是Spring设计用来框架内部使用的,如果使用了Spring Aware,你的Bean就会和Spring框架耦合。也就不能换容器了。

猜你喜欢

转载自blog.csdn.net/java_collect/article/details/82083186