• Spring中ApplicationContextAware的作用


    ApplicationContextAware 通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContext方法。

    我们在ApplicationContextAware的实现类中,就可以通过这个上下文环境对象得到Spring容器中的Bean。

      看到—Aware就知道是干什么的了,就是属性注入的,但是这个ApplicationContextAware的不同地方在于,实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来: 
    使用方法如下:

    1.实现ApplicationContextAware接口:

    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    import com.co.ayz.rpc.registry.ServiceRegistry;
    
    public class RpcServer implements ApplicationContextAware{
    
        private ApplicationContext context;
    
            @Override
        public void setApplicationContext(ApplicationContext applicationContext)
                throws BeansException {
            // TODO Auto-generated method stub
            context = applicationContext;       
        }   
         //获得applicationContext
        public static ApplicationContext getApplicationContext() {
            //assertContextInjected();
            return context;
        }    
        public static void clearHolder(){
            context=null;
        }
        //获取Bean
        public static <T> T getBean(Class<T> requiredType){
            //assertContextInjected();
            return (T) getApplicationContext().getBean(requiredType);
        }
        @SuppressWarnings("unchecked")
        public static <T> T getBean(String name){
            assertContextInjected();
            return (T) getApplicationContext().getBean(name);
        }    
        //判断application是否为空
        public static void assertContextInjected(){
            Validate.isTrue(context==null, "application未注入 ,请在springContext.xml中注入SpringHolder!");
        }
    }

    因为我们在做开发的时候,并不是说在每一个地方都能将属性注入到我们想要的地方去的,比如在Utils使用到dao,我们就不能直接注入了,这个时候就是我们需要封装springContext的时候了,而ApplicationContextAware就起了关键性的作用。

    自己写的demo:

    /**  
    * @Title: SpringJobBeanFactory.java
    * @Package com.founder.mrp.job
    * @Description: TODO
    * @version V1.0  
    */
    
    package com.founder.mrp.job;
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    @Component
    public class SpringJobBeanFactory implements ApplicationContextAware {
    
        
        private static ApplicationContext applicationContext;
        
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            SpringJobBeanFactory.applicationContext=applicationContext;
            
        }
         public static ApplicationContext getApplicationContext() {
                return applicationContext;
        }
        @SuppressWarnings("unchecked")
        public static <T> T getBean(String name) throws BeansException {
                if (applicationContext == null){
                    return null;
                }
                return (T)applicationContext.getBean(name);
          }
    }
    
    
    使用:
    TypeSetErpService typeSetErpServ = SpringJobBeanFactory.getBean("typeSetErpServiceImpl");
     
  • 相关阅读:
    Spark学习笔记2(spark所需环境配置
    Spark学习笔记1(初始spark
    zookeeper基本讲解及基本命令和配置 (转)
    计算机网络面试常考(转载)
    C++面试笔试题汇总
    复杂指针解析
    如何限制一个类对象只在栈(堆)上分配空间?
    虚函数实现机制
    C++内存分配方式详解
    C++中指针和引用的区别(转载)
  • 原文地址:https://www.cnblogs.com/loong-hon/p/10917755.html
Copyright © 2020-2023  润新知