Spring Aware
Spring Aware的目的是为了让Bean获得Spring容器的服务。
Spring提供的所有Aware接口
常用的Aware接口
BeanNameAware 获得到容器中Bean的名称
BeanFactoryAware 获得当前bean Factory,从而调用容器的服务
ApplicationContextAware 获得当前的application context从而调用容器的服务
MessageSourceAware 得到message source从而得到文本信息
ApplicationEventPublisherAware 应用时间发布器,用于发布事件
ResourceLoaderAware 获取资源加载器,可以获得外部资源文件
EnvironmentAware 获取环境相关信息(包含设置的环境变量)
EmbeddedValueResolverAware 获取Spring提供的嵌入式解析器,可以解析Spring EL表达式
例子自定义Bean实现部分Aware接口获得Spring提供的相关服务:
/**
* Spring提供了很多Aware的接口实现类,可以通过实现这些接口实现类,来Spring的提供的服务
*/
@Component
public class LbSpringAware implements ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware {
private ApplicationContext applicationContext;
/**
* BeanNameAware 提供获取Bean的名称
* @param s
*/
public void setBeanName(String s) {
System.out.println("Bean的Id为:"+s);
}
/**
* ApplicationContextAware:可以获得Spring的上下文
* @param applicationContext
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
System.out.println("LbSpringAware-applicationContext:"+applicationContext);
}
/**
* EmbeddedValueResolverAware:可以获得Spring提供解析EL表达式的解析器
* @param stringValueResolver
*/
public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {
String result = stringValueResolver.resolveStringValue("os.name=${os.name},5+5=#{5+5}");
System.out.println("LbSpringAware解析EL表达式os.name=${os.name},5+5=#{5+5}的结果为:"+result);
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
}
@Configuration
@ComponentScan(value = {"com.lb.spring.day5.part17"})
public class MyConfigration17 {
}
public class Part17Test {
@Test
public void test() throws Exception {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfigration17.class);
System.out.println(app);
LbSpringAware lbSpringAware = app.getBean(LbSpringAware.class);
System.out.println(lbSpringAware.getApplicationContext());
System.out.println("IOC 容器初始化完成....");
}
}
结果:从结果可以发现,通过相关的Aware接口获得当前Bean的id,并且解析了EL表达式,获得ApplicaitonContext和加载配置的注解AppicationContext为同一个对象
Bean的Id为:lbSpringAware
LbSpringAware解析EL表达式os.name=${os.name},5+5=#{5+5}的结果为:os.name=Windows 7,5+5=10
LbSpringAware-applicationContext:org.springframework.context.annotation.AnnotationConfigApplicationContext@2471cca7: startup date [Thu Aug 27 16:10:26 CST 2020]; root of context hierarchy
org.springframework.context.annotation.AnnotationConfigApplicationContext@2471cca7: startup date [Thu Aug 27 16:10:26 CST 2020]; root of context hierarchy
org.springframework.context.annotation.AnnotationConfigApplicationContext@2471cca7: startup date [Thu Aug 27 16:10:26 CST 2020]; root of context hierarchy
IOC 容器初始化完成....