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 시키는 것을 확인했습니다.