Aware
作用:
- 实现了Aware接口的bean在初始化后可以获取相应资源
- 通过Aware接口,可以对Spring相应资源进行操作(对于操作的结果要慎重!)
- 为对Spring进行简单的扩展提供了方便的入口
常用 Aware 接口
ApplicationContextAware 提供 context 上下文信息
BeanNameAware 提供 BeanName(BeanId)
ApplicationEventPublisherAware
BeanFactoryAware
BootstrapContextAware
ServletConfigAware
注:一般是同时实现 ApplicationContextAware 和 BeanNameAware 接口,获取到 Bean 的 Id,利用 context.getBean(id) 获取其他 Bean 资源。
实现了Aware接口的bean在初始化后可以获取相应资源并进行相应的操作
ApplicationContextAware:向实现了该接口的bean提供IOC容器的上下文信息(ApplicationContext),实现了该接口的bean必须配置到配置文件中并由spring的bean容器加载
BeanNameAware:向实现了该接口的bean提供关于beanName定义的相关内容
配置文件 spring-aware.xml
测试ApplicationContext
<bean id="applicationContext" class="包.ApplicationContext"></bean>
测试BeanName
<bean id="beanName" class="包.BeanName"></bean>
public class ApplicationContext implements ApplicationContextAware{
@Override
public void setApplicationContext(org.springframework.context.ApplicationContext arg0)
throws BeansException {
System.out.println("ApplicationContext:"+
arg0.getBean("applicationContext").hashCode());
}
}
测试方法
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase {
public TestAware() {
super("classpath*:spring-aware.xml");
}
@Test
public void testApplicationContext() {
System.out.println("test方法中的ApplicationContext:"
+ super.getBean("applicationContext").hashCode());
}
@Test
public void testBeanName() {
System.out.println("test方法中的实例哈希值:"
+ super.getBean("beanName").hashCode());
}
}
测试(ApplicationContext)。结果打印出的两个类的哈希值一致,这说明实现了XXXAware接口,得到了输出
对于BeanName实现BeanNameAware,ApplicationContextAware接口的方式
public class BeanName implements BeanNameAware,ApplicationContextAware{
private String beanName;
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
System.out.println("setApplicationContext中的实例哈希值:"+arg0.getBean(this.beanName).hashCode());
}
@Override
public void setBeanName(String arg0) {
this.beanName = arg0;
System.out.println("BeanName:"+arg0);
}
}
不管是通过testBeanName基类获取的applicationContext还是通过XXXaware接口获取的applicationContext的哈希值一致,说明两种方式都可以访问到容器上下文对象
Resources && ResourceLoader
针对资源文件的统一接口
Resources
类型 | 描述 |
---|---|
UrlResource | 根据一个url地址即可构建 |
ClassPathResource | 获取类路径下的资源文件 |
FileSystemResource | 获取文件系统里面的资源 |
ServletContextResource | :ServletContext封装的资源,用于访问ServletContext环境下的资源 |
InputStreamResource | 针对输入流封装的资源 |
ByteArrayResource | 针对字节数组封装的资源 |
ResourceLoader:用来加载资源
- 所有 applicationcontext 都实现 ResourceLoader 接口
- 加载 Resource 资源类
- 前缀:classpath/file/http/none(applicationcontext)
public interface ResourceLoader{
Resource getResource(String Location);
}
Resource template=ctx.getResource("some/resource/path/myTemplate.txt");
Resource template=ctx.getResource("file:/some/resource/path/myTemplate.txt");
Resource template=ctx.getResource("classPath:some/resource/path/myTemplate.txt");
public class MoocResource implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
public void resource() throws IOException {
Resource resource = applicationContext.getResource("classPath:config.txt");//根据具体情况配置路径
System.out.println(resource.getFilename());
System.out.println(resource.contentLength());
}
}
@RunWith(BlockJUnit4ClassRunner.class)
public class TestResource extends UnitTestBase {
public TestResource() {
super("classpath:spring-resource.xml");
// <bean id="moocResource" class="com.imooc.resource.MoocResource" ></bean>
}
@Test
public void testResource() {
MoocResource resource = super.getBean("moocResource");
try {
resource.resource();
} catch (IOException e) {
e.printStackTrace();
}
}
}