Spring 中有很多继承于 aware 中的接口,这些接口到底是做什么用到的。

    image.png

    aware, 翻译过来是知道的,已感知的,意识到的,所以这些接口从字面意思应该是能感知到所有 Aware 前面的含义。

    先举个 BeanNameAware 的例子,实现 BeanNameAware 接口,可以让该 Bean 感知到自身的 BeanName(对应 Spring 容器的 BeanId 属性)属性,举个例子:

    定义两个 User, 一个实现 BeanNameAware, 一个不实现。

    main 方法测试一下 BeanNameAware 接口所起的作用。

    1. public static void main(String[] args) {
    2. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-beanaware.xml");
    3. User user=context.getBean(User.class);
    4. System.out.println(String.format("实现了BeanNameAware接口的信息BeanId=%s,所有信息=%s",user.getId(),user.toString()));
    5. User2 user2=context.getBean(User2.class);
    6. System.out.println(String.format("未实现BeanNameAware接口的信息BeanId=%s,所有信息=%s",user2.getId(),user2.toString()));
    7. }

    运行结果

    1. 实现了BeanNameAware接口的信息BeanId=zhangsan,所有信息=User{id='zhangsan', name='zhangsan', address='火星'}
    2. 未实现BeanNameAware接口的信息BeanId=null,所有信息=User{id='null', name='lisi', address='火星'}


    能够看到,我们在实现了 BeanNameAware 的 User 中,获取到了 Spring 容器中的 BeanId(对应 spring配置文件中的 id 属性),而没有实现 BeanNameAware 的 User2,则不能获取到 Spring 容器中的 Id 属性。

    所以 BeanNameAware 接口是为了让自身 Bean 能够感知到,获取到自身在 Spring 容器中的 id 属性。

    同理,其他的 Aware 接口也是为了能够感知到自身的一些属性。
    比如实现了 ApplicationContextAware 接口的类,能够获取到 ApplicationContext,实现了 BeanFactoryAware 接口的类,能够获取到 BeanFactory 对象。

    作者:一滴水的坚持
    链接:https://www.jianshu.com/p/c5c61c31080b
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。