Spring的Aware接口讲解,内含几篇参考文章

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Aware接口文章

一、使用Aware与不使用Aware的效果

参考文章Spring中的aware接口

  1. 定义BeanNameAware接口
public interface BeanNameAware extends Aware {
      void setBeanName(String name);
}
  1. 定义两个User一个实现BeanNameAware一个不实现BeanNameAware
public class User implements BeanNameAware{

    private String id;

    private String name;

    private String address;

    public void setBeanName(String beanName) {
        //ID保存BeanName的值
        id=beanName;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
public class User2 {

    private String id;

    private String name;

    private String address;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
  1. 在Spring配置文件中初始化两个对象
 <bean id="zhangsan"  class="com.github.jettyrun.springinterface.demo.aware.beannameaware.User">
        <property name="name" value="zhangsan"></property>
        <property name="address" value="火星"></property>
    </bean>

    <bean id="lisi"  class="com.github.jettyrun.springinterface.demo.aware.beannameaware.User2">
        <property name="name" value="lisi"></property>
        <property name="address" value="火星"></property>
    </bean>
  1. main方法测试
 public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-beanaware.xml");

        User user=context.getBean(User.class);
        System.out.println(String.format("实现了BeanNameAware接口的信息BeanId=%s,所有信息=%s",user.getId(),user.toString()));

        User2 user2=context.getBean(User2.class);
        System.out.println(String.format("未实现BeanNameAware接口的信息BeanId=%s,所有信息=%s",user2.getId(),user2.toString()));
    }
  1. 运行结果
实现了BeanNameAware接口的信息BeanId=zhangsan,所有信息=User{id='zhangsan', name='zhangsan', address='火星'}
未实现BeanNameAware接口的信息BeanId=null,所有信息=User{id='null', name='lisi', address='火星'}
  1. 分析结果
  • 能够看到我们在实现了BeanNameAware的 User中获取到了Spring容器中的BeanId对应spring配置文件中的id属性而没有实现BeanNameAware的User2则不能获取到Spring容器中的Id属性。
  • 所以BeanNameAware接口是为了让自身Bean能够感知到获取到自身在Spring容器中的id属性。
  • 同理其他的Aware接口也是为了能够感知到自身的一些属性。
    比如实现了ApplicationContextAware接口的类能够获取到ApplicationContext实现了BeanFactoryAware接口的类能够获取到BeanFactory对象。

二、ApplicationContext实例介绍Aware

参考文章Spring的Aware接口原来是这么回事

  1. 想要使用ApplicationContext对象就要实现ApplicationContextAware接口
public class MyApplicationContextAware implements ApplicationContextAware {
    // 用一个全局变量保存接口回调时传入的applicationContext对象
    private ApplicationContext applicationContext;

	// 使用获取的applicationContext对象,查看容器中有哪些bean.
    public void printAllBean(){
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        System.out.println("当前容器中的bean如下");
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
  1. 把MyApplicationContextAware这个bean注册到容器中
<bean id="myApplicationContextAware" 
class="com.kaka.spring.context.aware.MyApplicationContextAware"/>
  1. 执行代码
    @Test
    public void awareTest(){
        ClassPathXmlApplicationContext classPathXmlApplicationContext = 
        			new ClassPathXmlApplicationContext("applicationContext.xml");
        MyApplicationContextAware myApplicationContextAware = 
        			classPathXmlApplicationContext.getBean("myApplicationContextAware",MyApplicationContextAware.class);
        myApplicationContextAware.printAllBean();
    }
  1. 运行结果
    在这里插入图片描述

三、从Aware顶级接口实现自己的XXXAware

参考视频Aware依赖注入管理

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring

“Spring的Aware接口讲解,内含几篇参考文章” 的相关文章