Access Resource

1. ResourceLoader

Spring has a DefaultResourceLoader which can return ClassPathResource, UrlResource, and ServletContextResourceLoader which extends all functions of DefaultResourceLoader.

@Test
public void testResourceLoad() throws IOException {
	ResourceLoader loader = new DefaultResourceLoader();
	Resource resource = loader.getResource("classpath:cn/javass/spring/chapter4/test.txt");
	Assert.assertEquals(ClassPathResource.class, resource.getClass());
}

In ApplicationContext also can implement ResourceLoader:

  • ClassPathXmlApplicationContext
  • FileSystemXmlApplicationContext
  • WebApplicationContext

2. ResourceLoaderAware

Injection via ApplicationContext:

import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.ResourceLoader;

public class ResourceBean implements ResourceLoaderAware {
	private ResourceLoader resourceLoader;

	@Override
	public void setResourceLoader(ResourceLoader resourceLoader) {
		this.resourceLoader = resourceLoader;
	}

	public ResourceLoader getResourceLoader() {
		return resourceLoader;
	}
}
<bean class="cn.javass.spring.chapter4.ResourceBean" />

JUnit test:

@Test
public void test() {
		ApplicationContext context = new ClassPathXmlApplicationContext("chapter4/resourceLoaderAware.xml");
		ResourceBean bean = context.getBean(ResourceBean.class);
		ResourceLoader loader = bean.getResourceLoader();
		Assert.assertTrue(loader instanceof ApplicationContext);
}

3. Resource Injection

import org.springframework.core.io.Resource;

public class ResourceBean3 {
	private Resource resource;

	public Resource getResource() {
		return this.resource;
	}

	public void setResource(Resource resource) {
		this.resource = resource;
	}
}
<bean id="resourceBean1" class="cn.javass.spring.chapter4.ResourceBean3">
	<property name="resource" value="cn/javass/spring/chapter4/test.properties"/>
</bean>

<bean id="resourceBean2" class="cn.javass.spring.chapter4.ResourceBean3">
	<property name="resource" value="classpath:cn/javass/spring/chapter4/test.properties"/>
</bean>

JUnit test:

@Test
public void test() {
		ApplicationContext context = new ClassPathXmlApplicationContext("chapter4/resourceInject.xml");

		ResourceBean3 resourceBean1 = context.getBean("resourceBean1", ResourceBean3.class);

		ResourceBean3 resourceBean2 = context.getBean("resourceBean2", ResourceBean3.class);

		Assert.assertTrue(resourceBean1.getResource() instanceof ClassPathResource);
		Assert.assertTrue(resourceBean2.getResource() instanceof ClassPathResource);
}