Spring扩展点之Aware接口族

Spring中提供了各种Aware接口,方便从上下文中获取当前的运行环境,比较常见的几个子接口有:BeanFactoryAware,BeanNameAware,ApplicationContextAware,EnvironmentAware,BeanClassLoaderAware等

这些Aware的作用都可以从命名得知

Aware的处理

其中BeanNameAwareBeanClassLoaderAwareBeanFactoryAware这三个是直接在bean的初始化之前就处理了的,具体代码在AbstractAutowireCapableBeanFactory.initializeBean方法中:

protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) {	
    // 判断对象实现的接口类型,处理特定的三种接口类型:BeanNameAware、BeanClassLoaderAware和BeanFactoryAware。	
    if (bean instanceof BeanNameAware) {	
        ((BeanNameAware) bean).setBeanName(beanName);	
    }	
 	
    if (bean instanceof BeanClassLoaderAware) {	
        ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());	
    }	
 	
    if (bean instanceof BeanFactoryAware) {	
        ((BeanFactoryAware) bean).setBeanFactory(this);	
    }	
    // 开始Bean初始化前处理、初始化、初始化后处理	
    Object wrappedBean = bean;	
    if (mbd == null || !mbd.isSynthetic()) {	
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);	
    }	
 	
    try {	
        invokeInitMethods(beanName, wrappedBean, mbd);	
    }	
    catch (Throwable ex) {	
        throw new BeanCreationException(	
                (mbd != null ? mbd.getResourceDescription() : null),	
                beanName, "Invocation of init method failed", ex);	
    }	
 	
    if (mbd == null || !mbd.isSynthetic()) {	
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);	
    }	
    return wrappedBean;	
}

除了这三种之外的那些Aware接口的实现就不太一样了,它们都是利用BeanPostProcessor接口完成的,关于BeanPostProcessor接口的原理可以这篇文章:Spring扩展点之BeanPostProcessor

ApplicationContextAware就是利用ApplicationContextAwareProcessor实现的:

public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {	
    AccessControlContext acc = null;	

	
    if (System.getSecurityManager() != null &&	
        (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||	
            bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||	
            bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {	
      acc = this.applicationContext.getBeanFactory().getAccessControlContext();	
    }	

	
    if (acc != null) {	
      AccessController.doPrivileged((PrivilegedAction<Object>) () -> {	
        //具体实现	
        invokeAwareInterfaces(bean);	
        return null;	
      }, acc);	
    }	
    else {	
              //具体实现	
      invokeAwareInterfaces(bean);	
    }	

	
    return bean;	
  }	
private void invokeAwareInterfaces(Object bean) {	
    if (bean instanceof Aware) {	
      if (bean instanceof EnvironmentAware) {	
        ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());	
      }	
      if (bean instanceof EmbeddedValueResolverAware) {	
        ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);	
      }	
      if (bean instanceof ResourceLoaderAware) {	
        ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);	
      }	
      if (bean instanceof ApplicationEventPublisherAware) {	
        ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);	
      }	
      if (bean instanceof MessageSourceAware) {	
        ((MessageSourceAware) bean).setMessageSource(this.applicationContext);	
      }	
      if (bean instanceof ApplicationContextAware) {	
        ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);	
      }	
    }	
  }

ApplicationContextAwareProcessor的注册奥秘在AbstractApplicationContext.prepareBeanFactory方法中:

beanFactory.setBeanClassLoader(getClassLoader());	
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this));	
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); 	
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);	
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);	
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);	
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值