Whiteship's Note


Resource를 속성으로 가지는 클래스

Spring/Chapter 4 : 2007.03.21 12:56


Resource로 사용할 파일의 이름이나 위치가 자주 바뀌는 경우에 Resource 타입의 변수를 가지고 있는 클래스의 속성을 configuration 파일에 설정 해두는 것이 편할 수 있습니다.

public class PlainResourceHolder {
    private Resource resource;

    public Resource getResource() {
        return resource;
    }

    public void setResource(Resource resource) {
        this.resource = resource;
    }
}

이렇게 Resource를 가지고 있는 클래스가 있을 때 설정 파일에서도 prefix를 사용해서 Resourc에 값을 넣어 줄 수 있습니다.
<bean id="holder2" class="resource.PlainResourceHolder">
        <property name="resource" value="file:resourceTest.txt" />
</bean>

다음과 같이 테스트를 해보면 원하는 대로 일이 처리 된 걸 확인할 수 있습니다.
    @Test public void resourceFromConfiguration(){
        PlainResourceHolder holder = (PlainResourceHolder)context.getBean("holder2");
        Resource resource =  holder.getResource();
        assertTrue(resource.exists());
        assertTrue(resource.getFilename().equals("resourceTest.txt"));
    }

top

Write a comment.


ResouceLoaderAware 인터페이스

Spring/Chapter 4 : 2007.03.21 12:03


BeanFactoryAware, ApplicationContextAware.. 그리고 ResourceLoaderAware까지.. 대체 뭐가 그렇게 많이 알고 싶은거냐..ㅋㅋ

public interface ResourceLoaderAware {
  void setResourceLoader(ResourceLoader resourceLoader);
}

이 녀석을 구현하면 녀석을 bean으로 등록 해 두면 ApplicationContext가 로딩 될 때 ResourceLoader를 찾아서 DI해줍니다.

ApplicationContext 자체가 근데 이미 ResourceLoader라는 것을 저번 글에서 살펴 봤기 때문에 굳이 ResourceLoader 객체를 따로 만들지 않아도 됩니다.

다음과 같은 테스트를 작성했습니다.
    @Test public void resourceLoaderAware(){
        ResourceHolder holder = (ResourceHolder)context.getBean("holder"); //1
        Resource resource = holder.getResource(); //2
        assertTrue(resource.exists()); //3
        assertTrue(resource.getFilename().equals("resourceTest.txt")); //4
        assertEquals(context.getClass(), holder.getResourceLoader().getClass()); //5
    }

먼저 ResourceLoaderAware 인터페이스를 구현한 ResourceHolder 클래스를 하나 만들었습니다. 기존에 예제에서 사용하던 Member가 구현해도 되겠지만 클래스가 너무 덩치가 커져서요;;

public class ResourceHolder implements ResourceLoaderAware {

    private ResourceLoader resourceLoader;

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

    public Resource getResource() {
        return resourceLoader.getResource("file:resourceTest.txt");
    }

    public ResourceLoader getResourceLoader(){
        return resourceLoader;
    }
}

resourceLoader 객체가 있다고 치고 그걸 사용해서 getResource를 구현해 줬습니다. 그리고 resourceLoader가 대체 어떤 녀석인지 알아 보기 위해 반환 받아서 테스트 코드의 5번 줄에서 제가 예제에서 계속 사용하고 있는 ClassPathXmlApplicationContext인지 확인해 봤습니다.

테스트는 통과 하였고... ApplicationContext가 자기 자신을 ResourceLoader로써 ResourceLoaderAware 인터페이스를 구현한 클래스의 속성으로 DI 시키는 것을 확인했습니다.


top

Write a comment.


Resource 인터페이스와 클래스들

Spring/Chapter 4 : 2007.03.20 10:23


Resource 인터페이스 extends InputStreamSource
사용자 삽입 이미지
InputStreamSource 인터페이스
사용자 삽입 이미지
구현한 클래스들
AbstractResource, ByteArrayResource, ClassPathResource, DescriptiveResource, FileSystemResource, InputStreamResource, PortletContextResource, ServletContextResource, UrlResource
계층 구조를 대강 그려보면 다음과 같이 중간에 AbstractResource를 두고 그것을 상속받고 있습니다.

사용자 삽입 이미지


top

Write a comment.