专栏首页波波烤鸭Spring之Aware接口介绍

Spring之Aware接口介绍

  在Bean对象的生命周期的方法中有好几个接口是Aware接口的子接口,所以弄清楚Aware接口对于理解Spring框架还是很有帮助的。

Aware接口

  Aware接口从字面上翻译过来是感知捕获的含义。单纯的bean(未实现Aware系列接口)是没有知觉的;实现了Aware系列接口的bean可以访问Spring容器。这些Aware系列接口增强了Spring bean的功能,但是也会造成对Spring框架的绑定,增大了与Spring框架的耦合度。(Aware是“意识到的,察觉到的”的意思,实现了Aware系列接口表明:可以意识到、可以察觉到) 接口的源码如下:

public interface Aware {

}

  可以发现该接口中并没有定义任何方法,所以这是个标识接口。该接口的子接口有如下:

1.Aware系列接口的共性

  1. 都以“Aware”结尾
  2. 都是Aware接口的子接口,即都继承了Aware接口
  3. 接口内均定义了一个set方法

2.Aware子接口中的set方法

2.1ApplicationContextAware

void setApplicationContext(ApplicationContext applicationContext)

2.2BeanClassLoaderAware

void setBeanClassLoader(ClassLoader classLoader);

2.3BeanFactoryAware

void setBeanFactory(BeanFactory beanFactory)

2.4BeanNameAware

void setBeanName(String name);

…每个子接口都定义了set方法。而方法中的形参是接口Aware前面的内容,也就是当前Bean需要感知的内容。所以我们需要在Bean中声明相关的成员变量来接收。

3.举例说明

目标类

/**
 * 实现了
 * 	ApplicationContextAware
 *  BeanClassLoaderAware
 *  BeanFactoryAware
 *  BeanNameAware
 *  接口
 * @author dengp
 *
 */
public class User implements ApplicationContextAware,BeanClassLoaderAware,BeanFactoryAware,BeanNameAware{

	private int id;
	
	private String name;
	// 保存感知的信息
	private String beanName;
	// 保存感知的信息
	private BeanFactory beanFactory;
	// 保存感知的信息
	private ApplicationContext ac;
	// 保存感知的信息
	private ClassLoader classLoader;
	
	public BeanFactory getBeanFactory() {
		return beanFactory;
	}

	public ApplicationContext getAc() {
		return ac;
	}

	public ClassLoader getClassLoader() {
		return classLoader;
	}

	public User(){
		System.out.println("User 被实例化");
	}

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public String getBeanName() {
		return beanName;
	}
	
	/**
	 * 自定义的初始化方法
	 */
	public void start(){
		System.out.println("User 中自定义的初始化方法");
	}
	
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", beanName=" + beanName + "]";
	}

	@Override
	public void setBeanClassLoader(ClassLoader classLoader) {
		System.out.println(">>> setBeanClassLoader");
		this.classLoader = classLoader;
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		System.out.println(">>> setApplicationContext");
		this.ac = applicationContext;
	}

	@Override
	public void setBeanName(String name) {
		System.out.println(">>> setBeanName");
		this.beanName = name;
	}

	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		System.out.println(">>> setBeanFactory");
		this.beanFactory = beanFactory;
	}
}

测试类

@Test
public void test1() {
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	User user = ac.getBean(User.class);
	System.out.println("beanFactory:"+user.getBeanFactory());
	System.out.println("beanName:"+user.getBeanName());
	System.out.println("applicationContext:"+user.getAc());
	System.out.println("classLoader:"+user.getClassLoader());
	System.out.println(user);
}

输出结果

User 被实例化
>>> setBeanName
>>> setBeanClassLoader
>>> setBeanFactory
>>> setApplicationContext
User 中自定义的初始化方法
beanFactory:org.springframework.beans.factory.support.DefaultListableBeanFactory@4520ebad: defining beans [user]; root of factory hierarchy
beanName:user
applicationContext:org.springframework.context.support.ClassPathXmlApplicationContext@311d617d: startup date [Sun Mar 03 22:43:08 CST 2019]; root of context hierarchy
classLoader:sun.misc.Launcher$AppClassLoader@4aa298b7
User [id=0, name=波波烤鸭, beanName=user]

Aware系列接口,主要用于辅助Spring bean访问Spring容器

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot整合Ehcache

      本文介绍下SpringBoot整合SpringDataJPA后加入缓存组件Ehcache的操作。

    用户4919348
  • Java观察者模式(Observer)

      观察者模式java GOF23种设计模式中的一种。在最近介绍的Redis和ActiveMQ中都涉及到了观察者模式,所以我们在本文详细介绍下此模式:

    用户4919348
  • Java工厂模式

      工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,工厂模式在Java程序中可以说是随处可见。本文来给大家详细介绍下工厂模式

    用户4919348
  • 第二阶段-Java面向对象:【第五章 接口】

    2. 接口中一般不定义变量,因为接口中的变量会被默认指定为 public static final 变量(只能是)

    BWH_Steven
  • 设计模式六大原则(4):接口隔离原则

    定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类...

    Angel_Kitty
  • java接口

    接口中常量的修饰关键字:public,static,final(常量) 函数的修饰关键字:public,abstract 如果没有写全,系统在编译时会自动加上 ...

    用户3030674
  • 一个类实现多个接口的同名方法会报错吗?

    大家好,我是小刀,今天和大家讨论一下接口实现的两个问题,众所周知,接口是设计模式的基石,所以了解接口的一些实现对理解设计模式,源码都大有裨益!

    微笑的小小刀
  • abp部分接口转换为首字母大写返回

    在对接手机端app接口时,由于手机端需要返回的模型使用首字母大写的形式,abp(asp.net core)接口默认返回的数据是驼峰命名法,就是首字母小写,我们自...

    用户6362579
  • [C#1] 11-接口

    接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承的是接口中的方法签名,而非方法实现,通常称为实现接口; 接口仅仅是...

    blackheart
  • Android回调接口的写法

    六月的雨

扫码关注云+社区

领取腾讯云代金券