Aware

在Spring当中有一些内置的对象是未开放给我们使用的,例如Spring的上下文ApplicationContext、环境属性Environment,BeanFactory等等其他的一些内置对象,而在我们可以通过实现对应的Aware接口去拿到我们想要的一些属性,一般命名都是xxxAware,在创建对象的时候, 会调用接口规定的方法注入到相关组件:Aware

常用的Aware:

用法示例:

源码解析

我们先了解什么是BeanPostProcessor,是在创建Bean之前以及创建Bean之后的一种后置处理器,这里就简单的讲一下这个,就是在我们使用的这些注解,例如:@Async (异步执行),@Bean,@Component、@Autowired、@PropertySource等等都需要经过BeanPostProcessor去处理才能加载到容器当中,

先看一个示例:

不仅仅有BeanPostProcessor还有BeanDefinitionRegistryPostProcessor(Bean注册器后置处理器)、BeanFactoryPostProcessor(BeanFactory后置处理器),

在处理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@Nullablepublic 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((PrivilegedAction<Object>) () -> {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);}}}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {return bean;}}

不得不说Spring的这种设计还是很厉害的,建议可以买本Spring IOC源码分析的书看看比较好,了解的更加细致

Spring中Aware的用法以及实现相关推荐

  1. Spring中jdbcTemplate的用法实例

    一.首先配置JdbcTemplate: 要使用Jdbctemplate 对象来完成jdbc 操作.通常情况下,有三种种方式得到JdbcTemplate 对象.        第一种方式:我们可以在自己 ...

  2. Spring中HibernateCallback的用法(转)

    Hibernate的复杂用法HibernateCallback HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式.Hiber ...

  3. Spring中RedirectAttributes的用法

    RedirectAttributes 是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的的工具类.他有两种带参的方式: 第一种: redirectAttribut ...

  4. Spring中ApplicationContextAware的用法

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt379 一.这个接口有什么用? 当一个类实现了这个接口(Application ...

  5. spring中的JdbcTemplate——JdbcTemplate的最基本用法

    spring中的JdbcTemplate JdbcTemplate的作用: 它就是用于和数据库交互的,实现对表的CRUD操作 JdbcTemplate 概述 它是 spring 框架中提供的一个对象, ...

  6. Spring中@Resource与@Autowired、@Qualifier的用法与区别

    Spring中@Resource与@Autowired.@Qualifier的用法与区别 1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法 ...

  7. Spring中@Async用法总结

    转载自 https://blog.csdn.net/blueheart20/article/details/44648667 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的 ...

  8. spring中最重要的一些Aware接口

    附上关于这节的spring官方文档: ApplicationContextAware and BeanNameAware aware接口在spring中无处不在,它是用来感知spring的ioc co ...

  9. spring中@Autowired用法

    @Autowired注解是Spring中非常重要且常见的,接下来就简要的介绍一下它的用法. @Autowired默认是通过set方法,按照类型自动装配JavaBean,set方法可省略不写,它主要是修 ...

最新文章

  1. BRCM5.02编译七:No package 'uuid' found
  2. python 统计组合用什么库_Python数据科学,用这些库就够了
  3. 微博 Android 启动广告,使用Xposed去除微博国际版的启动广告
  4. 飞天茅台超卖P0事故:请慎用Redis分布式锁!
  5. Excel还是那些事
  6. linux openssl 证书,Linux上的openSSL证书验证
  7. 中考在即,杂乱的书房
  8. ThinkPHP框架学习(一)
  9. 数据库SQL(介绍)
  10. 如何把qsv视频格式转换成mp4视频格式
  11. html调用zblog文章,自定义调用ZBLOG分类页、内容页模板
  12. 关于LSF的高级用法
  13. 关于reduce的理解
  14. Vue.js 框架源码与进阶 - 搭建自己的SSR
  15. [激光原理与应用-43]:《光电检测技术-10》- 激光测距原理、方案与案例分析:TOF VL53L0X模块
  16. 京东购物车(html+css+js)
  17. 解锁iPhone的三种方法
  18. 在blog中显示天气预报、日历、时钟、MSN、QQ在线状态
  19. 【OpenGL ES】正方形图片贴到圆形上
  20. ftp登录工具,三款好用的ftp登录工具

热门文章

  1. 释放tcp连接的命令是_最实用的6个网络命令,网络故障不求人
  2. html hover效果下拉个框,关于下拉菜单(CSS)中,“:hover”样式的设置问题?
  3. lintcode 最长上升连续子序列 II(二维最长上升连续序列)
  4. Hibernate学习之hibernate.cfg.xml
  5. java pdf增删改查_如何利用Java代码操作索引库?
  6. .gitignore文件_【第1739期】为Git仓库里的.idea文件夹正名
  7. android双联动列表,Android Fragment实现列表和内容联动
  8. sync不生效 vue_Vue实战项目-记账器-重要知识点汇总
  9. python现有两个磁盘文件a和b_有两个磁盘文件A和B,各存放一行字母,今要求把这两个文件中的信息合并,输出到一个新文件C中。...
  10. html画图代码_python之matplotlib画图教程(2)