zoukankan      html  css  js  c++  java
  • Spring中ApplicationContextAware的作用

    通过ApplicationContextAware,Spring容器会自动调用上下文环境对象ApplicationContextAware接口中的setApplicationContext方法,从而获得容器中的指定Bean。

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

      看到Aware就知道是干什么的了,这个ApplicationContextAware的不同地方在于,实现了这个接口的类,当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;
    
    public class RpcServer implements ApplicationContextAware{
    
        private ApplicationContext context;
    
            @Override
        public void setApplicationContext(ApplicationContext applicationContext)
                throws BeansException {
            // TODO Auto-generated method stub
            this.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就起了关键性的作用。

    使用案例

    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");
    
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
  • 相关阅读:
    [翻译]Webpack解惑
    Vue.js与angular在数据实现的思考
    多线程入门-第三章-线程的调度与控制之优先级
    多线程入门-第二章-线程的生命周期
    多线程入门-第一章-线程的创建与启动
    多线程入门-概述
    IO流入门-第十三章-File相关
    IO流入门-第十二章-ObjectInputStream_ObjectOutputStream
    IO流入门-第十一章-PrintStream_PrintWriter
    IO流入门-第十章-DataInputStream_DataOutputStream
  • 原文地址:https://www.cnblogs.com/hhddd-1024/p/14515360.html
Copyright © 2011-2022 走看看