美文网首页
Spring生命周期钩子之ApplicationContextA

Spring生命周期钩子之ApplicationContextA

作者: GeekerLou | 来源:发表于2019-11-10 15:55 被阅读0次

    我们在使用Spring框架进行日常的项目开发的过程中,往往不是每一个地方都能将属性注入到我们想要的地方去的,比如在某个Utils的静态方法中使用到dao,或者某个对象每次都是在使用到的时候new一个新对象出来,就不能使用直接注入的功能了。这个时候就是我们需要封装springContext的时候了,而ApplicationContextAware就起了关键性的作用。

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

    对这个ApplicationContextAware不太熟悉的同学不妨回忆一下Spring初始化bean的过程,里面Spring框架为我们预留了一个关键的钩子方法,ApplicationContextAware便是其中一个,下面是详细的加载全过程:

    1. 调用 BeanNameAware 的 setBeanName 方法
    2. 调用 BeanFactoryAware 的 setBeanFactory 方法
    3. 调用 ApplicationContextAware 的 setApplicationContext
    4. 调用 InitializingBean 的 afterPropertiesSet 或者没有实现这个接口,但指定了@Bean(initMethod="不加括号的方法名"),会执行这个方法
    5. 调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法
    6. 调用 BeanPostProcessor 的 postProcessAfterInitialization 方法
    7. Bean 初始化完成,可以被使用
    8. 容器关闭前,调用 DisposableBean 的 destroy 方法

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

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

    下面举一个具体的Demo:
    首先,我们定义一个SpringMasterdataContext,实现ApplicationContextAware接口,Spring会在容器加载的时候将applicationContext通过setApplicationContext方法注入进来。

    public class SpringMasterdataContext implements ApplicationContextAware{
    
        private ApplicationContext context;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext)
                throws BeansException {
            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);
        } 
    
       public static Object getBean(String name) {
            return context.getBean(name);
        }   
    
        //判断application是否为空
        public static void assertContextInjected(){
            Validate.isTrue(context==null, "application未注入 ,请在springContext.xml中注入SpringHolder!");
        }
    }
    

    为了将SpringMasterdataContext托管给Spring框架,我们可以使用xml中定义一个bean的方式或者加@Component注解到SpringMasterdataContext类上都是可以的,这里给一个xml定义bean的例子:

    <bean id="springMasterdataContext"
              class="com.**.SpringMasterdataContext"
              lazy-init="false" />
    

    相关文章

      网友评论

          本文标题:Spring生命周期钩子之ApplicationContextA

          本文链接:https://www.haomeiwen.com/subject/owlabctx.html