精通 Spring 源码 | Spring 中的各种 Aware

一、简介

Spring 提供了一种接口 —— Aware,这也是 Spring 中的扩展点,Aware 字面意思是感知到的,它能感知到什么呢?他的实现有 BeanFactoryAware,BeanNameAware,ApplicationContextAware, ImportAware 等等。这些接口能让我们动态地获取 Bean 的名字,工厂,还有这个容器的上下文,也就是他所能感知到的。最原始的接口如下,我们通过 Ctrl + h 就能找到他的实现类。

public interface Aware {
}

精通 Spring 源码 | Spring 中的各种 Aware_第1张图片

二、示例

配置类

@Configuration
@ComponentScan("com.javahly.spring73")
public class AppConfig {
}

往容器中注入两个实验对象

@Component
public class IndexService {
}
@Component
public class UserService {
}
1、BeanNameAware

我们只需要提供 setter 方法,就能动态得到当前 Bean 的名字,如下代码,我们自定义了 MyBeanNameAware 实现 BeanNameAware 接口,命名为 MyName,并且得到了当前 Bean 的名字并通过 getBeanName 方法返回。最终结果打印出了 Bean 的名字。

@Component("MyName")
public class MyBeanNameAware implements BeanNameAware {

	private String name;

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

	public String getBeanName() {
		return name;
	}
}
public class Test {

	public static void main(String[] args){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
		MyBeanNameAware myBeanNameAware = applicationContext.getBean(MyBeanNameAware.class);
		System.out.println(myBeanNameAware.getBeanName());
	}
}
输出结果:MyName
2、BeanFactoryAware

和之前的原理一样,我们只需要提供 setBeanFactory 方法,就能动态得到这个工厂。

@Component
public class MyBeanFactoryAware implements BeanFactoryAware {

	private static BeanFactory beanFactory;

	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		this.beanFactory = beanFactory;
	}

	public static BeanFactory getBeanFactory(){
		return beanFactory;
	}
}

这里我们先是获得了这个工厂,然后通过这个工厂动态获得了一个 Bean 为 indexService,在实际开发中,在我们的业务代码中,如果需要动态的获取某个 Bean,从而切换处理某些业务逻辑,我们可以通过这种方法。BeanFactory 还提供了很多方法,比如这个 Bean 是单例的还是原型的,是否在这个工厂里面,是什么类型的等等。

public class Test {

	public static void main(String[] args){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
		System.out.println(MyBeanFactoryAware.getBeanFactory().getBean("indexService"));

	}
}
输出结果为:com.javahly.spring73.service.IndexService@649d209a
3、ApplicationContextAware

ApplicationContextAware 则是获取整个 Spring 容器的上下文,也就是整个 Spring 容器,通过 ApplicationContextAware 不仅可以动态获得一个 Bean,还能获取所有 BeanDefinition ,也就是 Bean 的定义信息等等。

@Component
public class MyApplicationContextAware implements ApplicationContextAware {

	private static ApplicationContext applicationContext;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext =applicationContext;
	}

	public static ApplicationContext getApplicationContext(){
		return applicationContext;
	}
}
public class Test {

	public static void main(String[] args){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
		System.out.println(MyApplicationContextAware.getApplicationContext().getBean("indexService"));
		//获取有多少个 BeanDefinition ,包括我们自定义的和 Spring 内部的
		System.out.println(MyApplicationContextAware.getApplicationContext().getBeanDefinitionCount());
	}
}
输出结果
com.javahly.spring73.service.IndexService@28f67ac7
12

更多用法后续更新…

—— 完

创作不易,如果可以,看完点个关注和赞再走吧!

ABOUT

我的 Github:Github
CSDN: CSDN
个人网站: sirius blog

推荐阅读
史上最全,最完美的 JAVA 技术体系思维导图总结,没有之一!
全站导航 | 文章汇总!

你可能感兴趣的:(精通,Spring,源码)