今天学习到了spring aware ,特地百度了下这方面的知识,现在谈下我的理解。
Spring
的依赖注入的最大亮点就是你所有的Bean
对Spring
容器的存在是没有意识的。即你可以将你的容器替换成别的容器,例如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,就是不知道这样做实际上有什么意义)