自定义Bean中要想使用Spring容器底层的一些组件(比如:ApplicationContext、BeanFactory等),此时,只需要让自定义组件实现XxxAware接口即可。此时,Spring在创建对象的时候,会调用XxxAware接口定义的方法,注入相关的组件。
配置bean:
/**
* description:
* author:dingyawu
* date:created in 10:25 2020/12/7
* history:
*/
public class Color implements ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware {
private ApplicationContext applicationContext;
private String beanName;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("传入的ioc:" + applicationContext);
this.applicationContext = applicationContext;
}
@Override
public void setBeanName(String name) {
System.out.println("当前bean的名字:" + name);
this.beanName = name;
}
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
String resolveStringValue = resolver.resolveStringValue("你好${os.name} 年龄:#{20*2}");
System.out.println("解析后的字符串为:" + resolveStringValue);
}
}
配置类:
/**
* description:
* author:dingyawu
* date:created in 23:37 2020/12/4
* history:
*/
@Configuration
public class ColorConfig {
@Bean
public Color color(){
return new Color();
}
}
测试类:
/** 测试ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware接口的用法 */
@Test
public void testBlueAware() {
// 创建IOC容器
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext(ColorConfig.class);
Color color = ac.getBean(Color.class);
ac.close();
}
几点说明
1)EmbeddedValueResolverAware,通过EmbeddedValueResolverAware接口能够获取到StringValue解析器
2)XxxAware的底层原理是由XxxAwareProcessor类实现的, 例如,我们这里以ApplicationContextAware接口为例,ApplicationContextAware接口的底层原理就是由ApplicationContextAwareProcessor类实现的。从ApplicationContextAwareProcessor类的源码可以看出,其实现了BeanPostProcessor接口,本质上都是后置处理器。
class ApplicationContextAwareProcessor implements BeanPostProcessor