原创

Spring中Aware接口说明

文章源码:https://github.com/Sniper2016/SpringStudy

学习了上一章的 bean 生命周期,你会发现很多地方使用了 Aware 结尾的接口,那他们有什么用呢?

一、介绍

aware接口
aware接口

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

二、举例

光从上面的介绍很难理解他到底有什么作用,下面举个例子就能直观的知道 aware 的作用

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

  • BeanNameAware 接口的定义
public interface BeanNameAware extends Aware {
      void setBeanName(String name);
}
  • 定义两个 User,一个实现 BeanNameAware,一个不实现。

User

package cn.gameboys.aware;

import org.springframework.beans.factory.BeanNameAware;

public class User implements BeanNameAware {
 private String id;

 private String name;

 private String beanName;


 @Override
 public void setBeanName(String name) {
  this.beanName = name;
 }

 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;
 }

 @Override
 public String toString() {
  return "User [id=" + id + ", name=" + name + ", beanName=" + beanName + "]";
 }

}

User2

package cn.gameboys.aware;


public class User2 {
 private String id;

 private String name;

 private String 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;
 }

 @Override
 public String toString() {
  return "User [id=" + id + ", name=" + name + ", beanName=" + beanName + "]";
 }

}

  • 在 Spring 配置文件中初始化两个对象。
 <bean id="zhangsanBean" class="cn.gameboys.aware.User">
  <property name="id" value="66"></property>
  <property name="name" value="zhangsan"></property>
 </bean>

 <bean id="lisiBean" class="cn.gameboys.aware.User2">
  <property name="id" value="77"></property>
  <property name="name" value="lisi"></property>
 </bean>
  • main 方法测试一下 BeanNameAware 接口所起的作用。
package cn.gameboys.aware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public abstract class Test {
 public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext("aware-test.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()));
 }
}


  • 运行结果
实现了BeanNameAware接口的信息BeanId=66,所有信息=User [id=66, name=zhangsan, beanName=zhangsanBean]
未实现BeanNameAware接口的信息BeanId=77,所有信息=User [id=77, name=lisi, beanName=null]

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

而没有实现 BeanNameAware 的 User2,则不能获取到 Spring 容器中的 Id 属性。

三、结论

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

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

正文到此结束