spring中自定義組件需要使用spring的底層組件時,可以通過自定義組件實現相關XxxAware接口,重寫其中的方法進而實現
例如:自定義一個組件,該組件中需要使用ApplicationContext、BeanFactory,那么我們就可以通過實現ApplicationContextAware、BeanFactoryAware接口實現
ApplicationContextAware
public class MyAware implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("傳入的IOC容器applicationContext = [" + applicationContext + "]"); this.applicationContext = applicationContext; } } @Configuration public class AwareConfig { @Bean public MyAware myAware(){ return new MyAware(); } } public class TestAware { @Test public void testM(){ ApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class); System.out.println("context = " + context); } }
結果 傳入的IOC容器applicationContext = [org.springframework.context.annotation.AnnotationConfigApplicationContext@2ff5659e: startup date [Wed May 29 14:00:42 GMT+08:00 2019]; root of context hierarchy] context = org.springframework.context.annotation.AnnotationConfigApplicationContext@2ff5659e: startup date [Wed May 29 14:00:42 GMT+08:00 2019]; root of context hierarchy
BeanNameAware
public class MyAware implements BeanNameAware{ @Override public void setBeanName(String name) { System.out.println("name = [" + name + "]"); } }
結果 name = [myAware] context = org.springframework.context.annotation.AnnotationConfigApplicationContext@2ff5659e: startup date [Wed May 29 14:07:16 GMT+08:00 2019]; root of context hierarchy
EmbeddedValueResolverAware
public class MyAware implements EmbeddedValueResolverAware{ @Override public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) { String value = stringValueResolver.resolveStringValue("當前操作系統:${os.name},10-9=#{10-9}"); System.out.println("value = " + value); } }
結果 value = 當前操作系統:Windows 10,10-9=1 context = org.springframework.context.annotation.AnnotationConfigApplicationContext@2ff5659e: startup date [Wed May 29 14:13:11 GMT+08:00 2019]; root of context hierarchy
其它XxxAware用法類似
通過Aware可以把spring底層組件注入到自定義的bean中,再用相應的processor處理器處理
ApplicationContextAware是利用ApplicationContextAwareProcessor來處理的,XxxAware也有相應的processor進行處理,其實就是相關后置處理器完成處理工作