自定义组件想要使用Spring容器底层的一些组件(ApplicationContext
,BeanFactory
等),需要实现xxxAware
;在创建对象的时候,会调用接口规定的方法注入相关组件;
把Spring底层一些组件注入到自定义的Bean中;
例如:
-
拿到spring的IOC容器,实现
ApplicationContextAware
接口; -
获得spring ioc容器给当前Bean设置的名称,实现
BeanNameAware
接口; -
获得特殊符号的解析器,实现
EmbeddedValueResolverAware
接口;
xxxAware
接口都是继承Aware
接口,实现Aware
接口的类都有一个后置处理器BeanPostProcessor
处理对应的功能;
例如:ApplicationContextAware(实现Aware接口) --> ApplicationContextAwareProcessor(实现BeanPostProcessor接口)
1、拿到spring的IOC容器
public class MyBean implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//拿到spring的IOC容器
System.out.println("传入的IOC容器:"+ applicationContext);
}
}
2、获得spring ioc容器给当前Bean设置的名称
public class MyBean implements BeanNameAware{
@Override
public void setBeanName(String name) {
//获得spring给当前Bean设置的名称
System.out.println("当前bean的名字:"+name);
}
}
3、获得特殊符号的解析器
public class MyBean implements EmbeddedValueResolverAware {
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
String resolveStringValue = resolver.resolveStringValue("你好 ${os.name},我是#{20*18}");
System.out.println(resolveStringValue);
}
}
测试:
//配置类
@Configuration
public class MainConifgOfAutowired {
@Bean
public MyBean myBean(){
return new MyBean();
}
}
//测试类
public class IOCTest {
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConifgOfAutowired.class);
System.out.println("创建容器完成!");
}
}
//打印:省略spring底层组件
当前bean的名字:myBean
你好 Windows 10,我是360
传入的IOC容器:org.springframework.context.annotation.AnnotationConfigApplicationContext@77afea7d, started on Tue Dec 01 18:07:12 CST 2020