Aware在Spring当中有一些内置的对象是未开放给我们使用的例如Spring的上下文ApplicationContext、环境属性EnvironmentBeanFactory等等其他的一些内置对象而在我们可以通过实现对应的Aware接口去拿到我们想要的一些属性一般命名都是xxxAware在创建对象的时候, 会调用接口规定的方法注入到相关组件:Aware常用的Aware用法示例源码解析我们先了解什么是BeanPostProcessor是在创建Bean之前以及创建Bean之后的一种后置处理器这里就简单的讲一下这个就是在我们使用的这些注解例如Async 异步执行BeanComponent、Autowired、PropertySource等等都需要经过BeanPostProcessor去处理才能加载到容器当中先看一个示例不仅仅有BeanPostProcessor还有BeanDefinitionRegistryPostProcessorBean注册器后置处理器、BeanFactoryPostProcessorBeanFactory后置处理器在处理Aware实现类的时候就会有对应的一个AwareProcessor去处理我们拿ApplicationContextAware做示例****我们找到对应的后置处理器ApplicationContextAwareProcessor因为BeanPostProcessor有两个接口实现但是只对处理前做内置对象赋值将对应的对象暴露给我们class ApplicationContextAwareProcessor implements BeanPostProcessor { private final ConfigurableApplicationContext applicationContext; private final StringValueResolver embeddedValueResolver; /** * Create a new ApplicationContextAwareProcessor for the given context. */ public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) { this.applicationContext applicationContext; this.embeddedValueResolver new EmbeddedValueResolver(applicationContext.getBeanFactory()); } Override Nullable public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException { AccessControlContext acc null; if (System.getSecurityManager() ! null (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware || bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware || bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) { acc this.applicationContext.getBeanFactory().getAccessControlContext(); } if (acc ! null) { AccessController.doPrivileged((PrivilegedActionObject) () - { invokeAwareInterfaces(bean); return null; }, acc); } else { invokeAwareInterfaces(bean); } return bean; } private void invokeAwareInterfaces(Object bean) { if (bean instanceof Aware) { if (bean instanceof EnvironmentAware) { ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment()); } if (bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver); } if (bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext); } if (bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext); } if (bean instanceof MessageSourceAware) { ((MessageSourceAware) bean).setMessageSource(this.applicationContext); } if (bean instanceof ApplicationContextAware) { ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); } } } Override public Object postProcessAfterInitialization(Object bean, String beanName) { return bean; } }不得不说Spring的这种设计还是很厉害的建议可以买本Spring IOC源码分析的书看看比较好了解的更加细致
Spring中Aware的用法以及实现
Aware在Spring当中有一些内置的对象是未开放给我们使用的例如Spring的上下文ApplicationContext、环境属性EnvironmentBeanFactory等等其他的一些内置对象而在我们可以通过实现对应的Aware接口去拿到我们想要的一些属性一般命名都是xxxAware在创建对象的时候, 会调用接口规定的方法注入到相关组件:Aware常用的Aware用法示例源码解析我们先了解什么是BeanPostProcessor是在创建Bean之前以及创建Bean之后的一种后置处理器这里就简单的讲一下这个就是在我们使用的这些注解例如Async 异步执行BeanComponent、Autowired、PropertySource等等都需要经过BeanPostProcessor去处理才能加载到容器当中先看一个示例不仅仅有BeanPostProcessor还有BeanDefinitionRegistryPostProcessorBean注册器后置处理器、BeanFactoryPostProcessorBeanFactory后置处理器在处理Aware实现类的时候就会有对应的一个AwareProcessor去处理我们拿ApplicationContextAware做示例****我们找到对应的后置处理器ApplicationContextAwareProcessor因为BeanPostProcessor有两个接口实现但是只对处理前做内置对象赋值将对应的对象暴露给我们class ApplicationContextAwareProcessor implements BeanPostProcessor { private final ConfigurableApplicationContext applicationContext; private final StringValueResolver embeddedValueResolver; /** * Create a new ApplicationContextAwareProcessor for the given context. */ public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) { this.applicationContext applicationContext; this.embeddedValueResolver new EmbeddedValueResolver(applicationContext.getBeanFactory()); } Override Nullable public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException { AccessControlContext acc null; if (System.getSecurityManager() ! null (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware || bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware || bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) { acc this.applicationContext.getBeanFactory().getAccessControlContext(); } if (acc ! null) { AccessController.doPrivileged((PrivilegedActionObject) () - { invokeAwareInterfaces(bean); return null; }, acc); } else { invokeAwareInterfaces(bean); } return bean; } private void invokeAwareInterfaces(Object bean) { if (bean instanceof Aware) { if (bean instanceof EnvironmentAware) { ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment()); } if (bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver); } if (bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext); } if (bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext); } if (bean instanceof MessageSourceAware) { ((MessageSourceAware) bean).setMessageSource(this.applicationContext); } if (bean instanceof ApplicationContextAware) { ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); } } } Override public Object postProcessAfterInitialization(Object bean, String beanName) { return bean; } }不得不说Spring的这种设计还是很厉害的建议可以买本Spring IOC源码分析的书看看比较好了解的更加细致