那些年我们一起着迷的Spring:Aware(五)

Spring慕课网学习
spring学习手册记录本

Aware

作用:

  1. 实现了Aware接口的bean在初始化后可以获取相应资源
  2. 通过Aware接口,可以对Spring相应资源进行操作(对于操作的结果要慎重!)
  3. 为对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接口

 配置文件 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");

ResourceLoader

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();
		}
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值