Spring的Aware接口实现及执行顺序详解
作者:刨红薯的小羊竿尔 发布时间:2023-03-09 09:50:53
一、实现了Aware的接口
Spring中有很多继承于aware中的接口,这些接口到底是做什么用到的,下面我们就一起来看看吧。
Aware 接口用于注入一些与容器相关信息,例如:
EnvironmentAware
:实现EnvironmentAware接口重写setEnvironment方法后,可以获得配置文件属性值
BeanClassLoaderAware
:注入加载当前 bean 的 ClassLoader
BeanNameAware
: 注入当前 bean 对应 beanName
BeanFactoryAware
: 注入 当前BeanFactory容器 的引用
ApplicationContextAware
: 获取容器本身ApplicationContext对象,可以在bean中得到bean所在的应用上下文
EmbeddedValueResolverAware
:获取properties文件单个属性值,一般使用@Value
属性值;EmbeddedValueResolverAware是另一种基于Spring解析获取 properties
文件单个属性值的方式
ApplicationEventPublisherAware
:事件发布器的接口,使用这个接口,我们自己的bean就拥有了发布事件的能力。
ResourceLoaderAware
:获取ResourceLoader实例,获取资源加载器读取资源文件
二、为什么要使用 Aware 接口
Aware接口是回调, * 和观察者设计模式的混合,一般指具备由Spring 容器通过Aware回调方法通知的特定的bean对象,简单来说就是可以通过实现该接口拿到Spring容器内部的一些资源。实际的回调方法由各个子接口确定,通常应仅包含一个接受单个参数、返回 void 的方法;但是一般情况下,Spring不建议使用该接口,因为使用这种方式会将业务代码与Spring 耦合,有所违背IOC 原则。
1、BeanNameAware
public class MyBeanName implements BeanNameAware {
@Override
public void setBeanName(String beanName) {
System.out.println(beanName);
}
}
2、BeanFactoryAware
public class MyBeanFactory implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void getMyBeanName() {
MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class);
System.out.println(beanFactory.isSingleton("myCustomBeanName"));
}
}
3、EnvironmentAware
@Configuration
public class MyBatisConfig implements EnvironmentAware {
private static Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Bean
public DataSource druidDataSource() throws Exception {
Properties props = new Properties();
props.put("driverClassName", environment.getProperty("datasource.driverClassName"));
props.put("url", environment.getProperty("datasource.url"));
props.put("username", environment.getProperty("datasource.username"));
props.put("password", environment.getProperty("datasource.password"));
return DruidDataSourceFactory.createDataSource(props);
}
}
4、EmbeddedValueResolverAware
@Component
public class PropertiesUtil implements EmbeddedValueResolverAware {
private StringValueResolver resolver;
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
this.resolver = resolver;
}
/**
* 获取属性,直接传入属性名称即可
* @param key
* @return
*/
public String getPropertiesValue(String key) {
StringBuilder name = new StringBuilder("${").append(key).append("}");
return resolver.resolveStringValue(name);
}
}
public class MyBean implements BeanNameAware, ApplicationContextAware, InitializingBean {
private static final Logger log = LoggerFactory.getLogger(MyBean.class);
@Override
public void setBeanName(String name) {
log.debug("当前bean " + this + " 名字叫:" + name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
log.debug("当前bean " + this + " 容器是:" + applicationContext);
}
@Override
public void afterPropertiesSet() throws Exception {
log.debug("当前bean " + this + " 初始化");
}
}
三、Aware接口执行顺序
定义类SimpleAware实现了部分Aware的接口的自定义bean,经过程序运行测试其执行顺序如下:
@Component
public class SimpleAware implements
ApplicationContextAware,
ApplicationEventPublisherAware,
BeanClassLoaderAware,
BeanFactoryAware,
BeanNameAware,
ResourceLoaderAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("ApplicationContextAware 回调");
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
System.out.println("ApplicationEventPublisherAware 回调");
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
System.out.println("BeanClassLoaderAware 回调");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryAware 回调");
}
@Override
public void setBeanName(String name) {
System.out.println("BeanNameAware 回调");
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
System.out.println("ResourceLoaderAware 回调");
}
}
按照以下顺序执行:
BeanNameAware-->BeanClassLoaderAware-->BeanFactoryAware-->ResourceLoaderAware-->ApplicationEventPublisherAware-->ApplicationContextAware
来源:https://juejin.cn/post/7180341492030898231


猜你喜欢
- 本文实例讲述了Java使用反射创建对象。分享给大家供大家参考,具体如下:一 实战1 代码import java.util.*;import
- 在C#中,可以使用一些第三方库或内置类库实现动态执行脚本的功能。以下是几个常用的方案:1.使用Roslyn编译器Roslyn是微软推出的一个
- 通过java的File类创建临时文件,然后在程序退出时自动删除临时文件。下面将通过创建一个JFrame界面,点击创建按钮在当前目录下面创建t
- * 什么是 * Spring MVC中的 * (Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户
- 本文实例为大家分享了C#使用Aforge调用摄像头拍照的具体代码,供大家参考,具体内容如下一、新建一个Winform项目二、使用Nuget添
- 题目给定count=0;让5个线程并发累加到1000;思路创建一个类MyRunnable,实现Runnable(继承Thread类也可)定义
- 本文实例讲述了Android编程之在SD卡上进行文件读写操作的方法。分享给大家供大家参考,具体如下:很多知识只有真正理解掌握之后才能运用自如
- 项目背景在做项目的时候,把SpringBoot的项目打包成安装包了,在客户上面安装运行,一切都是那么的完美,可是发生了意外,对方突然说导出导
- 本文实例讲述了Android编程简单实现雷达扫描效果。分享给大家供大家参考,具体如下:在eoe看到有一篇关于雷达扫描的文章,然后看了下,很简
- 一、常见问题所有的final修饰的字段都是编译期常量吗?如何理解private所修饰的方法是隐式的final?说说final类型的类如何拓展
- 本文实例讲述了Android权限操作之uses-permission。分享给大家供大家参考,具体如下:我们在安装Android软件的时候,系
- 前言大家应该都有所体会,平常在android应用中,有时候会用到系统通知是否开启的状态,以便进行下一步操作,所以,获取到状态是很有必要的,之
- OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的
- BindingResult 自定义错误信息前提概要在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过
- 恩 主要大家可以看下思路吧 图形界面里 除了图标和音乐两个资源 别的都是代码。 时间没有用timer组件 是自创的T
- Android的布局管理器本身就是个UI组件,所有的布局管理器都是ViewGroup的子类,而ViewGroup是View的子类,所以布局管
- 不久前项目开始了一段时间了,刚开始怀疑是Android Studio中新加入的Instant Run功能引起的,于是重新打release包后
- 在idea中将创建的java web项目部署到Tomcat中采用的工具idea 2018.3.6 Tomcat71.先创建第一个新项目sec
- 类注解@component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注。@Service 标注类,声明该类为业务层组件,用于处
- 一、问题Flutter原有的图片缓存机制,是通过PaintingBinding.instance!.imageCache来管理缓存的,这个缓