博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
精通 Spring 源码 | Spring 中的各种 Aware
阅读量:4104 次
发布时间:2019-05-25

本文共 3090 字,大约阅读时间需要 10 分钟。

一、简介

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

public interface Aware {}

在这里插入图片描述

二、示例

配置类

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

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

@Componentpublic class IndexService {}
@Componentpublic 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 方法,就能动态得到这个工厂。

@Componentpublic 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 的定义信息等等。

@Componentpublic 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@28f67ac712

更多用法后续更新…

—— 完

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

ABOUT

公众号:【星尘Pro】

github:

推荐阅读

转载地址:http://sffsi.baihongyu.com/

你可能感兴趣的文章
VS编译器运行后闪退,处理方法
查看>>
用div+css做下拉菜单,当鼠标移向2级菜单时,为什么1级菜单的a:hover背景色就不管用了?
查看>>
idea 有时提示找不到类或者符号
查看>>
JS遍历的多种方式
查看>>
ng-class的几种用法
查看>>
node入门demo-Ajax让前端angularjs/jquery与后台node.js交互,技术支持:mysql+html+angularjs/jquery
查看>>
神经网络--单层感知器
查看>>
注册表修改DOS的编码页为utf-8
查看>>
matplotlib.pyplot.plot()参数详解
查看>>
拉格朗日对偶问题详解
查看>>
MFC矩阵运算
查看>>
最小二乘法拟合:原理,python源码,C++源码
查看>>
ubuntu 安装mysql
查看>>
c# 计算器
查看>>
C# 简单的矩阵运算
查看>>
gcc 常用选项详解
查看>>
c++输入文件流ifstream用法详解
查看>>
c++输出文件流ofstream用法详解
查看>>
字符编码:ASCII,Unicode 和 UTF-8
查看>>
QT跨MinGW和MSVC两种编译器的解决办法
查看>>