先来看下aware的官方注释
Marker superinterface indicating that a bean is eligible to be
notified by the Spring container of a particular framework object
through a callback-style method. Actual method signature is
determined by individual subinterfaces, but should typically
consist of just one void-returning method that accepts a single
argument.
简单概括下意思是,标记这个接口的实现类能被spring容器框架的类通过回调方法“提醒”,具体的方法每个单独的子接口都不同,但是典型的组成是由一个无返回值且只接受一个参数的方法组成。
这边主要说明两类常见的aware子类,ApplicationContextAware和BeanNameAware
ApplicationContextAware接口
这个在前期说明spring 的后置处理器时已经说明过,在bean的初始化阶段做的处理,如果不熟悉,可以先看这篇文章:spring生命周期-BeanPostProcessor在spring中应用



这里将容器的对象放进初始化的bean中

BeanNameAware接口
这个也是在bean初始化方法里面做的处理,在前置处理器处理之前

将spring相关容器设置进bean

从这里可以看出,这个BeanNameAware 和ApplicationContextAware 接口初始化的方式和时间不是一样的。
实例很简单
@Component
public class Red implements ApplicationContextAware,BeanNameAware,EmbeddedValueResolverAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// TODO Auto-generated method stub
System.out.println("传入的ioc:"+applicationContext);
this.applicationContext = applicationContext;
}
@Override
public void setBeanName(String name) {
// TODO Auto-generated method stub
System.out.println("当前bean的名字:"+name);
}
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
// TODO Auto-generated method stub
String resolveStringValue = resolver.resolveStringValue("你好 ${os.name} 我是 #{20*18}");
System.out.println("解析的字符串:"+resolveStringValue);
}
}
@Test
public void test1(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成");
//applicationContext.getBean("car");
applicationContext.close();
}
结果为:


本文深入探讨Spring框架中的Aware接口,重点分析ApplicationContextAware和BeanNameAware的作用与区别。通过实例代码展示了如何在bean初始化阶段利用这些接口进行特定操作。
1万+

被折叠的 条评论
为什么被折叠?



