美文网首页
Spring中的Aware接口

Spring中的Aware接口

作者: 小丸子的呆地 | 来源:发表于2021-07-07 16:21 被阅读0次

    IOC是Spring的一个重要功能,Spring维护了一个BeanFactory去生成和缓存项目运行过程中的对象。这些对象分为用户对象,和上下文对象。
    用户对象就是我们自己定义的一些业务、工具类对象。
    上下文对象指的是Spring框架在创建过程中的使用的一些上下文对象或者信息,比如BeanFactory对象本身、BeanNameClassLoader等等。
    这些对象或者信息有Spring启动过程中生成并且维护,那么有时候我们需要在业务中使用这些信息,需要让框架主动的将这些信息赋值到我们需要的地方。
    Spring提供了Aware接口来帮助我们实现这件事,并且提供了丰富的Aware子类配合我们获取上下文对象或信息。

    所以Aware接口就是为了方便我们获取框架上下文对象或信息。

    比如BeanFactoryAware接口

    public interface BeanFactoryAware extends Aware {
    
        /**
         * Callback that supplies the owning factory to a bean instance.
         * <p>Invoked after the population of normal bean properties
         * but before an initialization callback such as
         * {@link InitializingBean#afterPropertiesSet()} or a custom init-method.
         * @param beanFactory owning BeanFactory (never {@code null}).
         * The bean can immediately call methods on the factory.
         * @throws BeansException in case of initialization errors
         * @see BeanInitializationException
         */
        void setBeanFactory(BeanFactory beanFactory) throws BeansException;
    
    }
    

    如果我们需要获取BeanFactory对象,那么只需要实现这个BeanFactoryAware接口,并且实现对应的setBeanFactory方法,Spring框架会在启动阶段执行这个方法,将beanFactory对象传入。这样我们就能拿到这个beanFactory对象了。

    而这个赋值的时机是在框架启动过程中,初始化对象属性时。

    • 对象实例化
      我们都知道创建Bean过程中首先为对象在内存中开辟一块空间,并且给对象的属性附上默认值。这个过程叫做对象的实例化。实例化后的对象还不能用,因为他还不完整。
    • 对象初始化
      紧接着我们会执行对象的初始化,首先我们会填充对象属性,调用的是populateBean方法(这个过程会产生对象的循环依赖问题,因为可能存在有些属性是另外的对象)。
      然后调用invokeAwareMethods方法,为对象注入对应的上下文对象。
      后面还有BeanPostProcessor相关方法执行,AOP是在这个阶段完成的,这里不详细列举了。

    相关文章

      网友评论

          本文标题:Spring中的Aware接口

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