今天学习到了spring aware ,特地百度了下这方面的知识,现在谈下我的理解。

Spring的依赖注入的最大亮点就是你所有的BeanSpring容器的存在是没有意识的。即你可以将你的容器替换成别的容器,例如Goggle Guice,这时Bean之间的耦合度很低。

但是在实际的项目中,我们不可避免的要用到Spring容器本身的功能资源,这时候Bean必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware。其实Spring Aware本来就是Spring设计用来框架内部使用的,若使用了Spring Aware,你的Bean将会和Spring框架耦合。

-------------------------------------

ps:这段话很官(抽)方(象),我的理解是,spring aware 的这些接口的存在,让我们可以获取、修改beanName(getBeanName)、事件发布(applicationContext.publishEvent)等。具体场景,我暂时不了解,百度也找不到,估计是会在一些架构方面做文章吧。

spring aware 以下是几个常用的接口:

1、ApplicationContextAware   能获取Application Context调用容器的服务

2、BeanNameAware    提供对BeanName进行操作

3、ApplicationEventPublisherAware   主要用于事件的发布

4、BeanClassLoadAware 相关的类加载器

5、BeanFactoryAware 声明BeanFactory的

下面直接上代码:

定义一个Bean AwareSevice ,继承BeanNameAware 和ResourceLoaderAware接口

package com.abc.service;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service; import java.io.IOException; @Service
public class AwareService implements BeanNameAware, ResourceLoaderAware { private String beanName;
private ResourceLoader resourceLoader; @Override
public void setBeanName(String s) {
this.beanName=s+"111";
} @Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader=resourceLoader;
} public void outputResult() {
System.err.println("Bean名字是:" + beanName); Resource resource = resourceLoader.getResource("classpath:application.yml"); try {
System.err.println("resource加载的文件内容是:" + resource.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}

可以看到,这里提供了setBeanName()和setResourceLoader(),用于设置BeanName和ResourceLoader。而我们没有继承这个的时候,用getBeanName()和getResourceLoader() 来获取的beanName和resourceLoader。

设置一个config,用来扫描这个包

package com.abc.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; @Configuration
@ComponentScan("com.abc.service")
public class AwareConfig {
}

调动service 的结果如下:

可以看到,这里的AwareService 的BeanName的确被改变了。(ps,就是不知道这样做实际上有什么意义)

最新文章

  1. 传智播客--ADO.net--SqlBulkCopy批量插入数据(小白必知)
  2. PHP Switch case 条件并用实例
  3. linux下svn命令使用大全
  4. [转]安卓开发startservice 和bindservice详解
  5. LCA 笔记
  6. hdu 5273 Dylans loves sequence 逆序数简单递推
  7. docker & nodejs
  8. 认识html标签
  9. WPF/MVVM 快速开发
  10. Android React Native 开发环境搭建---windows下
  11. Python 读取某个目录下的文件
  12. group()与groups()的区别
  13. (三十四)NavigationController初步
  14. THINKPHP中使用swoole
  15. Feed back TFS 2017 RC upgrade status to product team in product group 2017.03.01
  16. Nginx错误日志与优化专题
  17. day4-python基础
  18. 使用jQuery实现向上循环滚动效果(超简单)
  19. linux后台启动命令-的原因
  20. Loadrunder脚本篇——文件下载

热门文章

  1. 案例三:shell统计ip访问情况并分析访问日志
  2. SpringBoot 实现 excel 全自由导入导出,性能强的离谱,用起来还特优雅
  3. 【C# TAP 异步编程】三、async\await的运作机理详解
  4. Pycharm:Python2和3及其的Anaconda的正确设置
  5. pandas模块篇(之二)
  6. Python第三讲
  7. 《手把手教你》系列基础篇(七十三)-java+ selenium自动化测试-框架设计基础-TestNG实现启动不同浏览器(详解教程)
  8. 浅谈 SOLID 原则
  9. 单链表上的一系列操作(基于c语言)
  10. JAVA 线上问题排查方法