ApplicationContextAwareProcessor

1.介绍

ApplicationContextAwareProcessor是一个Spring内部工具,它实现了接口BeanPostProcessor,用于向实现了如下某种Aware接口的bean注入ApplicationContext中相应的属性:

  • EnvironmentAware

  • EmbeddedValueResolverAware

  • ResourceLoaderAware

  • ApplicationEventPublisherAware

  • MessageSourceAware

  • ApplicationContextAware

如果bean实现了以上接口中的某几个,那么这些接口方法调用的先后顺序就是上面接口排列的先后顺序。

EnvironmentAware、ResourceLoaderAware、ApplicationContextAware等

1.介绍

Spring框架预留的关键的接口,Spring容器会自动把Environment、ResourceLoader、ApplicationContext等对象通过set...()方法注入

2.使用

@Component
public final class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext;
private static Environment environment; // 通过set方法注入Environment
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
} // 通过set方法注入ApplicationContext
@Override
public void setApplicationContext(ApplicationContext contex) throws BeansException {
this.applicationContext = contex;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Environment getEnvironment() {
return environment;
}
}

3.触发点

ApplicationContextAwareProcessor类下:
private void invokeAwareInterfaces(Object bean) {
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);
}
}

4.顺序图

BeanNameAware、BeanClassLoaderAware、BeanFactoryAware

1.介绍

Spring框架预留的关键的接口,获取当前Bean的名称,获取当前Bean的类装载器和bean工厂。

如果bean实现了以上接口中的某几个,那么这些接口方法调用的先后顺序就是上面排列的先后顺序。

2.触发点

AbstractAutowireCapableBeanFactory类下:

private void invokeAwareMethods(String beanName, Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}

@PostConstruct

1.介绍

标注于需要执行的方法,在bean的初始化阶段,在BeanPostProcessor.postProcessBeforeInitialization之后,InitializingBean.afterPropertiesSet之前

方法不能有任何参数,不能是静态的,返回值必须是void,只会执行一次。

如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解标注的方法将会在依赖注入完成后被自动调用

执行顺序: 父类静态变量或静态语句块–>子类静态变量或静态语句块->父类实例变量或初始化语句块–>父类构造方法->子类实例变量或初始化语句块->子类构造方法--> @Autowired -> @PostConstruct....-> destroy -> @PreDestroy

2.触发点

最新文章

  1. [Silverlight]监听指定控件(FrameworkElement)的依赖属性(DependencyProperty)的更改
  2. Android中Activity加入Fragment使用注意事项及常用技巧
  3. SVN源码泄露漏洞
  4. 【php】使用phpdbg来调试php程序
  5. uniq-sort-awk
  6. IP地址转换成Long型数字的算法
  7. ubuntu下mysql的环境搭建及使用
  8. 同ListView该接口无法通过手势滑动左右切换界面问题解决方法
  9. MKNetWorkKit打印URL
  10. 开始学习MFC
  11. Sencha Touch学习(一)
  12. [Angular Tutorial] 11 -Custom Filters
  13. 笔记:I/O流-ZIP文档
  14. 作业07-Java GUI编程
  15. 2.9 linux学习(1)
  16. IdentityServer4【QuickStart】之使用asp.net core Identity
  17. 前端使用Javascrip实现图片轮播
  18. C# ComboBoxTree控件
  19. JS 链接里面有中文字符,出现乱码问题
  20. 欧拉回路 uoj117

热门文章

  1. 函数实现将 DataFrame 数据直接划分为测试集训练集
  2. 【刷题-LeetCode】213. House Robber II
  3. golang中锁
  4. SpringDataRedis入门到深入
  5. 学习JAVAWEB第三天
  6. Iceberg学习日记(1) 定位两个线上Iceberg查不到文件的问题
  7. 3. scala-spark wordCount 案例
  8. maven 中的工程依赖和层级依赖?
  9. flask学习1
  10. [POI2009]SLO-Elephants