spring之Aware接口
spring之Aware接口
一. 介绍Aware相关接口的功能
Aware,顾名思义,意识到的.这个接口也就是为了让Bean意识到自己的存在.首先,我承认我第一次去看这个有关资料并没有看懂这个接口是什么意思,后来测试后才明白.依赖注入是spring的一个重要的特性,但是在spring将bean注入到IoC容器时,bean对于自己与spring的关系一无所知,即如王云飞所说:bean对于spring容器的存在是没有意识的,即可以把容器换成别的容器也可以,这时候Bean之间的耦合度很低.
如果Bean实现了Aware相关的接口,那么Bean就可以感知到spring容器,此时它就可以用到spring容器的功能资源.但是此时,Bean就与IoC容器耦合了.
可以先去看集成了Aware的接口
此处挑选部分进行介绍.
BeanFactoryAware: 获取当前BeanFactory,可以调用容器服务.
BeanNameAware: 获取容器中Bean的名称.
ApplicationContextAware: 获取容器的上下文.可以调用容器服务.
ApplicationEventPublisherAware: 应用事件发布器.主要用于发布服务.
BeanClassLoadAware: 获取相关类加载器.
ResourceLoadAware: 获取资源加载器.可以获取外部资源文件.
MessageSourceAware: 获取message source,可以获取文本信息.
ServletContextAware: 获取servlet上下问.此功能要在web服务中使用.
ApplicationContextAware接口集成了MessageSourceAware接口,ResourceLoadAware接口及 ApplicationEventPublisherAware接口,所以Bean只要实现ApplicationContextAware接口就可以获取spring容器的所有服务.但是原则上用到什么接口就是用什么接口.
二. 以BeanNameAware和ResourceLoadAware两个接口做演示
被测试文件:
被测试类:
package com.yczuoxin.demo.config;
import org.apache.commons.io.IOUtils;
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.Component;
import java.io.IOException;
@Component
public class DemoBean implements BeanNameAware,ResourceLoaderAware {
private String beanName;
private ResourceLoader resourceLoader;
@Override
public void setBeanName(String name) {
this.beanName = name;
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
public void print(){
System.out.println("DemoBean 类在spring容器中的Name: " + beanName);
Resource resource = resourceLoader.getResource("classpath:test.txt");
try {
System.out.println("ResourceLoader 加载的文件信息为: " + IOUtils.toString(resource.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
配置类:
package com.yczuoxin.demo.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.yczuoxin.demo.config")
public class AwareConfig {
}
测试类:
package com.yczuoxin.demo.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AwareTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class);
DemoBean demoBean = context.getBean(DemoBean.class);
demoBean.print();
context.close();
}
}
DemoBean 类在spring容器中的Name: demoBean
ResourceLoader 加载的文件信息为: 1234567
测试结果成功.
还没有评论,来说两句吧...