Spring生命周期钩子之ApplicationContextA

2019-11-10  本文已影响0人  GeekerLou

我们在使用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" />
上一篇 下一篇

猜你喜欢

热点阅读