zoukankan      html  css  js  c++  java
  • spring的aware学习

    简介

    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框架耦合。也就不能换容器了。

  • 相关阅读:
    MongoDB 安装及其配置
    hdu 1241 Oil Deposits
    2014ACM/ICPC亚洲区北京站
    hdu 5901 count prime & code vs 3223 素数密度
    hdu 2191 珍惜现在,感恩生活
    FOJ 2181 快来买肉松饼
    hdu 5384 Danganronpa
    hdu 2222 Keywords Search
    hdu 1300 Pearls
    2016.2.24. 《构建之法》开始阅读
  • 原文地址:https://www.cnblogs.com/seasail/p/12179395.html
Copyright © 2011-2022 走看看