Spring中的aware接口

╰半夏微凉° 2021-05-18 20:36 572阅读 0赞

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

format_png

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

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

  • BeanNameAware接口的定义

    public interface BeanNameAware extends Aware {

    1. void setBeanName(String name);

    }

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

    package com.github.jettyrun.springinterface.demo.aware.beannameaware;

    import org.springframework.beans.factory.BeanNameAware;

    /**

    • Created by jetty on 18/1/31.
      */
      public class User implements BeanNameAware{

      private String id;

      private String name;

      private String address;

      public void setBeanName(String beanName) {

      1. //ID保存BeanName的值
      2. id=beanName;

      }

      public String getId() {

      1. return id;

      }

      public void setId(String id) {

      1. this.id = id;

      }

      public String getName() {

      1. return name;

      }

      public void setName(String name) {

      1. this.name = name;

      }

      public String getAddress() {

      1. return address;

      }

      public void setAddress(String address) {

      1. this.address = address;

      }

      @Override
      public String toString() {

      1. return "User{" +
      2. "id='" + id + '\'' +
      3. ", name='" + name + '\'' +
      4. ", address='" + address + '\'' +
      5. '}';

      }
      }

  1. package com.github.jettyrun.springinterface.demo.aware.beannameaware;
  2. import org.springframework.beans.factory.BeanNameAware;
  3. /**
  4. * Created by jetty on 18/1/31.
  5. */
  6. public class User2 {
  7. private String id;
  8. private String name;
  9. private String address;
  10. public String getId() {
  11. return id;
  12. }
  13. public void setId(String id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public String getAddress() {
  23. return address;
  24. }
  25. public void setAddress(String address) {
  26. this.address = address;
  27. }
  28. @Override
  29. public String toString() {
  30. return "User{" +
  31. "id='" + id + '\'' +
  32. ", name='" + name + '\'' +
  33. ", address='" + address + '\'' +
  34. '}';
  35. }
  36. }
  • 在Spring配置文件中初始化两个对象。




    1. <bean id="lisi" class="com.github.jettyrun.springinterface.demo.aware.beannameaware.User2">
    2. <property name="name" value="lisi"></property>
    3. <property name="address" value="火星"></property>
    4. </bean>
  • main方法测试一下BeanNameAware接口所起的作用。

    public static void main(String[] args) {

    1. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-beanaware.xml");
    2. User user=context.getBean(User.class);
    3. System.out.println(String.format("实现了BeanNameAware接口的信息BeanId=%s,所有信息=%s",user.getId(),user.toString()));
    4. User2 user2=context.getBean(User2.class);
    5. System.out.println(String.format("未实现BeanNameAware接口的信息BeanId=%s,所有信息=%s",user2.getId(),user2.toString()));
    6. }
  • 运行结果

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

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

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,572人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring-aware接口

    在springmvc中如果某个bean需要获取spring 的某些容器,可以通过实现其接口的方式,来获得,以此达到在Bean被初始后,能进行CRUD、数据源动态注入到全局应用等